Introdução aos tubos nomeados na casca de bash

Introdução aos tubos nomeados na casca de bash

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
Introdução aos tubos nomeados na casca de bash

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
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…