Em que formato a saída canalizada é enviada e recebida de um comando / programa para outro? [duplicado]

4

Quando um comando é canalizado para outro comando, de que maneira ou em qual formato a saída canalizada existe / é enviada? É um arquivo temporário? É uma corda? E como o comando que recebe a saída canalizada decodifica / lê aquela saída?

Exemplo:

echo "Someone string" | ./program | tail

O programa " program " recebe a saída de echo como um arquivo? Como o programa leria nessa entrada?

    
por AymenTM 23.09.2018 / 12:04

3 respostas

3

Funciona como um fluxo de bits. É assim que é enviado e como é recebido. As interfaces são descritores de arquivo (ou handles ). Um arquivo simples também é tratado dessa maneira.

Veja:

por 23.09.2018 / 12:16
5

Um pipe é uma forma de redirecionamento (transferência da saída padrão para algum outro destino) que é usado no Linux e em outros sistemas operacionais semelhantes ao Unix para enviar a saída de um comando / programa / processo para outro comando / programa / processo para processamento adicional. Os sistemas Unix / Linux permitem que o stdout de um comando seja conectado ao stdin de outro comando. Você pode fazer isso usando o caractere de pipe "|".

O pipe é usado para combinar dois ou mais comandos e, neste, a saída de um comando atua como entrada para outro comando e essa saída de comando pode atuar como entrada para o próximo comando e assim por diante. Ele também pode ser visualizado como uma conexão temporária entre dois ou mais comandos / programas / processos. Os programas de linha de comando que fazem o processamento adicional são chamados de filtros.

Essa conexão direta entre comandos / programas / processos permite que eles operem simultaneamente e permite que os dados sejam transferidos entre eles continuamente, em vez de ter que passar por arquivos de texto temporários ou pela tela de exibição. Os tubos são unidirecionais, ou seja, fluxo de dados da esquerda para a direita através do pipeline.

Sintaxe:

command_1 | command_2 | command_3 | .... | command_N 

Exemplo: Listar todos os arquivos e diretórios e fornecê-lo como entrada para mais comandos.

$ ls -l | more 

O comando more obtém a saída de ls -l como sua entrada. O efeito líquido desse comando é que a saída de ls -l é exibida uma tela por vez. Os canais agem como um contêiner que recebe a saída de ls -l e atribui a more como entrada. Esse comando não usa um disco para conectar a saída padrão de ls -l à entrada padrão de more porque o pipe é implementado na memória principal. Em termos de operadores de redirecionamento de E / S, o comando acima é equivalente à seguinte sequência de comandos.

$ ls -l -> temp
more -> temp (or more temp)
[contents of temp]
rm temp

Mais 1 , 2 , 3

    
por 23.09.2018 / 12:16
4

./program recebe a saída de echo como um arquivo, ou seja, o arquivo de fluxo padrão /dev/stdin . Demonstração:

echo foo | wc -c
echo foo | wc -c /dev/stdin

Saídas:

4
4 /dev/stdin

Nota: um arquivo de fluxo é um pouco diferente de um arquivo armazenado em um disco. Nós podemos acessar dados aleatoriamente em um arquivo normal, mas não em um streaming . É como a diferença entre um CD player e um rádio tocando uma música. No CD player podemos retroceder, avançar, buscar e pular músicas. O rádio apenas envia (ou transmite) o que a emissora está enviando agora .

Onde o fluxo é armazenado? O sistema operacional o armazena em um buffer de dados temporário , cujo tamanho varia entre sistemas operacionais. Veja Qual é o tamanho do buffer de tubos?

Em um nível mais baixo, o SO usa descritores de arquivos , e não nomes de arquivos. Os descritores de arquivos são apenas uma pilha de números, para os quais cada identificador de processo tem sua própria pilha. O Linux também permite acessar o /dev/stdin stream, (que é sempre descritor de arquivo "0" ), dessa forma:

echo foo | wc -c /proc/self/fd/0

Saída:

4 /proc/self/fd/0

Mais uma abstração do Linux pode ser vista com o realpath util:

realpath /dev/stdin /proc/self/fd/0

Saída (no terminal atual do meu sistema):

/dev/pts/2
/dev/pts/2

As letras pts representam P seudo T erminal s . Esse último 2 number sempre variará entre os terminais, por isso não é um nome confiável, mas esses números podem ser usados para truques como: .

    
por 23.09.2018 / 12:16