Pipe (ciência da computação)

Da Wikipédia, a enciclopédia livre.
Ir para a navegação Ir para a pesquisa

O termo tubo tem dois significados intimamente relacionados:

Pipe como ferramenta de comunicação entre processos

Em sistemas operacionais, um pipe é uma das ferramentas disponíveis para fazer com que os processos se comuniquem entre si. Pipes , ao contrário de soquetes , oferecem um canal de comunicação unilateral e, portanto, dois devem ser usados ​​para alcançar a comunicação bidirecional.

Em Unix e sistemas operacionais semelhantes ao Unix , um pipe é acessível por meio de um par de descritores de arquivo , um para gravar dados e outro para lê-los. Um processo cria um pipe usando a chamada de sistema pipe (2) , que retorna os dois descritores de arquivo. [1]

Da mesma forma, nos sistemas operacionais Microsoft Windows , um pipe convencional é chamado de pipe anônimo e pode ser usado por meio de um par de alças : o primeiro para gravar dados, o segundo para ler. Para criar um pipe anônimo , a chamada de sistema CreatePipe deve ser usada.

O fluxo de dados escrito por um processo ( gravador ) no descritor de arquivo ou identificador aberto para gravação é então lido (na mesma ordem) pelo outro processo ( leitor ) por meio do descritor de arquivo ou identificador aberto para leitura. Os dados gerados pelo gravador e ainda não lidos são armazenados pelo sistema operacional em um buffer de tamanho predeterminado (normalmente alguns KiB ), do qual são removidos automaticamente após serem lidos.

O buffer é usado como um mecanismo de sincronização entre os dois processos: quando fica cheio, o processo de gravação é suspenso na operação de gravação até que o leitor tenha buscado uma parte dos dados; quando o buffer está vazio, o leitor é suspenso na operação de leitura até que o gravador envie novos dados.

Os dois processos que se comunicam por meio de um tubo devem, de alguma forma, trocar descritores de arquivo ou identificadores para usar:

  • em sistemas operacionais Unix e semelhantes ao Unix, um processo pode, por meio da chamada de sistema de pipe , criar um pipe , então, por meio da chamada de sistema fork , criar um processo filho , que herda os descritores de arquivo do pai: o processo pai que pode enviar dados para o processo filho, gravando no descritor de arquivo aberto para gravação, enquanto o processo filho pode recebê-lo lendo-o de outro descritor de arquivo (aberto para leitura). Este método requer que haja uma relação de parentesco entre os dois processos. Outros métodos requerem a troca de descritores de arquivo por meio de um soquete de domínio Unix. [2]
  • nos sistemas operacionais Microsoft Windows , um processo pode criar um canal anônimo por meio de uma chamada de sistema e, em seguida, criar um novo processo com o qual compartilhar identificadores especificando parâmetros para a chamada de sistema CreateProcess .

FIFO ou canais nomeados

Se dois processos que devem se comunicar um com o outro por um canal estiverem completamente separados (ou seja, eles não têm como trocar descritores ou identificadores de arquivo), é possível criar no sistema de arquivos um arquivo especial chamado FIFO ou canal nomeado , que atua como um ponto de acesso ao pipe : escrever neste arquivo especial envia dados para o pipe , enquanto a leitura pode ser obtida. Deve-se enfatizar que também neste caso os dados trocados não são armazenados temporariamente no sistema de arquivos , mas passam de um processo a outro através de um buffer.

Dessa forma, um processo pode oferecer um serviço a outros processos abrindo um canal nomeado em um local conhecido no sistema de arquivos .

Em sistemas operacionais Unix e semelhantes a Unix, um pipe nomeado pode ser criado por meio do comando mknod , ou por meio da chamada de sistema mknod de mesmo nome, ou por meio do comando mkfifo ; os processos que se comunicam por meio dele devem estar em execução no mesmo host (por exemplo, não é possível usar um pipe nomeado criado em um sistema de arquivos compartilhado na rede, como NFS, para fazer com que processos residentes em hosts diferentes se comuniquem).

Em sistemas operacionais Microsoft Windows , os canais nomeados são criados usando a chamada de sistema CreateNamedPipe . Ao contrário do Unix e dos sistemas semelhantes ao Unix, eles podem ser usados ​​diretamente por processos que residem em hosts diferentes.

Função de tubulação em cascas de texto

Nos shells de texto de muitos sistemas operacionais (incluindo Unix e sistemas semelhantes ao Unix, MS-DOS e Microsoft Windows), há uma sintaxe para combinar dois programas simples entre si com um pipe , a fim de realizar processamento complexo em cascata sem o 'uso de arquivos temporários (e, portanto, adequado, por exemplo, para grandes volumes de dados).

O caractere usado na sintaxe é a barra vertical : | , às vezes chamado de cachimbo ; ele é inserido entre as invocações de dois ou mais programas para informar ao shell que os dados direcionados à saída padrão do programa anterior devem ser enviados para a entrada padrão do próximo programa usando um pipe . Na verdade, o shell cria os tubos através de uma chamada de sistema, e em seguida, inicia os programas indicados, substituindo a saída padrão e a entrada padrão com os descritores do tubo de arquivo.

Por exemplo, em sistemas Unix e semelhantes a Unix, a seguinte linha de comando lê o arquivo file.txt por meio do comando cat , que envia dados para o comando tr para substituir espaços e sinais de pontuação pelo caractere de retorno um chefe; por sua vez, ele passa o resultado para o comando sort para ordenar as linhas, que o passa para o comando uniq para descartar as linhas duplicadas, obtendo assim uma lista ordenada alfabeticamente das palavras contidas no arquivo:

 cat arquivo.txt | tr '[[: espaço:] [: ponto:]]' '\ n' | sort | uniq

Uma sequência de comandos unidos por tubos como o acima é chamada de pipeline de software .

Um programa projetado para funcionar lendo dados da entrada padrão e produzindo o resultado na saída padrão é chamado de filtro .

Observação

  1. ^ (EN) W. Richard Stevens, 14,2 Pipes, em Advanced Programming in the UNIX Environment, Addison Wesley, 1992, pp. 428-434, ISBN 0-201-56317-7 .
  2. ^ (EN) W. Richard Stevens, 6:10 Passing File Descriptors, UNIX Network Programming, Prentice Hall, 1990, pp. 306-312, ISBN 0-13-949876-1 .

Itens relacionados