No entanto, o pipeline funciona assim: primeiro executa o primeiro comando e depois o segundo comando no seu caso.
Ou seja, vamos ter A|B
o comando dado. Então é incerto se A
ou B
começa primeiro. Eles podem começar exatamente ao mesmo tempo se houver várias CPUs. Um canal pode conter uma quantidade indefinida, mas finita, de dados.
Se B tentar ler do canal, mas nenhum dado estiver disponível, B
esperará até que os dados cheguem. Se B
estava lendo um disco, B
pode ter o mesmo problema e precisar aguardar até que a leitura do disco termine. Uma analogia mais próxima seria a leitura de um teclado. Lá, B
seria necessário aguardar o usuário digitar. Mas em todos esses casos, B iniciou uma operação de "leitura" e deve esperar até que seja concluída. Mas se B
é um comando que precisa apenas de saída parcial A
, após certo ponto em que B
o nível de entrada é atingido A
será eliminado pelo SIGPIPE
Se A
tentar gravar no tubo e o tubo estiver cheio, A
espere que haja espaço no tubo livre. A
poderia ter o mesmo problema se estivesse gravando em um terminal. Um terminal possui controle de fluxo e pode moderar o ritmo dos dados. De qualquer forma, para A
, iniciou uma operação de "gravação" e aguardará até que a operação de gravação seja concluída.
A
e B
estão se comportando como co-processos, embora nem todos os co-processos se comuniquem com um canal. Nenhum deles está no controle total do outro.
-m
argumento.