Introdução aos tubos nomeados na casca de bash
- 2088
- 7
- Robert Wunsch DVM
Nos sistemas operacionais baseados em Linux e UNIX, os tubos são muito úteis, pois são uma maneira simples de alcançar IPC (comunicação entre processos). Quando conectamos dois processos em um pipeline, a saída do primeiro é usada como a entrada do segundo. Para construir um chamado tubo "anônimo", tudo o que precisamos fazer é usar o |
operador. Tubos anônimos ou sem nome duram o tempo todo os processos que eles se conectam. Há, no entanto, outro tipo de tubo que podemos usar: um FIFO, ou tubo nomeado. Neste artigo, veremos como os tubos nomeados funcionam e no que eles são diferentes dos tubos padrão.
Neste tutorial, você aprenderá:
- O que é um tubo nomeado
- Como criar um tubo nomeado
- Como reconhecer um tubo nomeado
- Como os tubos nomeados funcionam
- Como excluir um tubo nomeado
Requisitos de software e convenções usadas
Categoria | Requisitos, convenções ou versão de software usada |
---|---|
Sistema | Distribuição Independente |
Programas | Os utilitários usados neste tutorial estão disponíveis por padrão |
Outro | Permissões de raiz para executar tarefas administrativas |
Convenções | # - requer que os comandos linux -comidos sejam executados com privilégios de raiz diretamente como usuário root ou por uso de sudo comando$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular |
Um rápido lembrete de como os tubos funcionam
Em um tutorial anterior, já vimos como os tubos funcionam e para que podem ser usados na introdução às redirecionamentos de conchas, mas vamos apenas fazer uma rápida recapitulação. Em nossos scripts ou em nossas sessões de concha interativa, podemos usar o operador de tubo (|
) para conectar dois processos juntos, para que a saída padrão (STDOUT) do processo no lado esquerdo do tubo seja usada como a entrada padrão (stdin) do processo no lado direito dele. Aqui está uma demonstração rápida e trivial:
$ echo "goot" | tr 't "d' bom
No exemplo acima, a saída do eco
O comando é usado como a entrada padrão do tr
um. Para aqueles que não sabem, o tr
O comando pode ser usado para traduzir ou excluir caracteres: aqui o usamos para substituir todas as ocorrências do t
personagem com o d
um. O resultado dos dois comandos unidos no que é chamado oleoduto, é a string "boa".
O que usamos no exemplo acima é chamado de um tubo sem nome. Esse tipo de tubo existe apenas até que os comandos sejam executados e não podem ser acessados depois. Se quisermos construir um cano e poder fazer referência após seu uso
Devemos usar o chamado Tubos nomeados, Vamos ver o que são e como eles funcionam.
O que é um tubo nomeado?
Em sistema operacional baseado em UNIX, como o Linux, um Pipe nomeado, ou FIFO (Primeiro in, primeiro a sair), é um tipo "especial" de arquivo usado para estabelecer uma conexão entre processos. Ao contrário de um tubo "padrão", um tubo nomeado é acessado como parte do sistema de arquivos, como qualquer outro tipo de arquivo. Uma vez criado, um tubo nomeado, aparecerá realmente como um arquivo padrão; No entanto, sempre parecerá vazio, pois não será usado para "armazenar" informações. Os dados que passarão pelo tubo serão gerenciados diretamente pelo kernel: o FIFO Will de arquivo é usado apenas como referência.
Criando um tubo nomeado
Para criar um Pipe nomeado, Nos modernos sistemas operacionais baseados em Linux, tudo o que devemos fazer é usar o mkfifo
comando. Em seu uso mais básico, tudo o que temos que passar como argumento para o programa é o nome que queremos usar para o FIFO arquivo. Para
instância, para criar um tubo nomeado chamado Pipe0
, nós funcionaríamos:
$ mkfifo Pipe0
Se desejado, um tubo nomeado também pode ser criado com um Conjunto específico de permissões usando o -m
opção (abreviação de --modo
) do mkfifo
comando. A opção aceita o Bits de permissão do arquivo como argumento, por exemplo, para criar um nomeado
tubo com 644
Permissões, nós funcionaríamos:
$ mkfifo -m 644 Pipe0
Vamos dar uma olhada no arquivo criado como resultado da execução do comando acima:
$ LS -L Pipe0 PRW-R-R--. 1 egdoc egdoc 0 dez 15 11:55 Pipe0
Aqui corremos o ls
comando com o -eu
opção, para que o formato de listagem longa fosse usado. Na saída do comando, podemos ver que a primeira letra que aparece antes dos bits de permissões é um p
: Isso indica que
O arquivo é realmente um tubo nomeado.
Usando um tubo nomeado
Sabemos como os tubos "padrão" funcionam: a saída padrão do processo à esquerda do tubo |
é usado como a entrada padrão daquele à sua direita. Pipes nomeados funciona da mesma forma. Vamos demonstrar isso. A primeira coisa que queremos
fazer é escrever algo para o tubo nomeado. Para fazer isso, podemos usar um redirecionamento simples; Abrimos um novo emulador de terminal e executamos o seguinte comando:
$ echo "mensagem de entrada"> Pipe0
Algo aparentemente inesperado acontece assim que pressionamos Enter: o comando parece pendurar. Isso se deve a como os tubos nomeados funcionam: para que os dados sejam passados através de um tubo nomeado, o FIFO O arquivo deve ser aberto nas duas extremidades, por um processo que está escrevendo para ele, e pelo menos quem quer ler disso.
Nesse caso, como não há nada que esteja "lendo" do tubo e "consumindo" seu conteúdo, dizemos que o tubo é bloqueado. Para demonstrar isso, vamos abrir outro emulador de terminal e usar o gato
comando para "ler" do tubo nomeado:
$ CAT PIPE0 Mensagem de entrada
Como você pode ver, a mensagem que escrevemos para o Pipe nomeada foi impressa na tela e no terminal que costumamos escrever no tubo, tudo está de volta ao normal (o comando não está mais pendurado e o prompt do shell aparece novamente). Como você pode ver no clipe abaixo, a mesma coisa acontece se abrirmos o tubo para a leitura, e não há nada escrevendo para ele:
Mais uma vez, nada é realmente escrito no Pipe0
arquivo e uma vez que o conteúdo de um tubo nomeado é "consumido", o tubo é limpo. Uma das vantagens dos tubos nomeados sobre os tubos padrão é que os processos do escritor e do leitor não precisam começar ao mesmo tempo.
Excluindo um tubo nomeado
Como um tubo nomeado é apenas um arquivo, para remover um, assumindo que temos as permissões certas para executar a ação, podemos usar o rm
comando. Para remover o tubo que criamos nos exemplos anteriores, funcionaríamos:
$ rm Pipe0
Conclusões
Neste artigo, aprendemos como Tubos nomeados Trabalhe no Linux. Vimos como eles são acessados como parte do sistema de arquivos, pois eles parecem ser como qualquer outro arquivo. Vimos como criar tubos nomeados usando o mkfifo comando, o quê
são a peculiaridade deles e um exemplo de seu uso. Finalmente, vimos como excluir um tubo nomeado.
Tutoriais do Linux relacionados:
- Manipulando a entrada do usuário em scripts bash
- Coisas para instalar no Ubuntu 20.04
- Uma introdução à automação, ferramentas e técnicas do Linux
- Como configurar o vsftpd no Debian
- Como lançar processos externos com Python e…
- Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
- Mastering Bash Script Loops
- Script Bash: Operador Unário esperado
- Como propagar um sinal para os processos filhos de uma festa…
- Sistema Linux Hung? Como escapar para a linha de comando e…