Sortof, o pipeline funciona assim: ele primeiro executa o primeiro comando e depois o segundo comando no seu caso.
Isto é, vamos ter A|B
como o comando dado. Então é incerto se A
ou B
começa primeiro. Eles podem começar exatamente no mesmo horário se houver várias CPUs. Um tubo pode conter uma quantidade indefinida, mas finita de dados.
Se B tentar ler o pipe, mas nenhum dado estiver disponível, B
esperará até que os dados cheguem. Se B
estivesse lendo de um disco, B
poderia ter o mesmo problema e precisar aguardar até que uma leitura de disco fosse concluída. Uma analogia mais próxima seria a leitura de um teclado. Lá, B
precisaria aguardar um usuário digitar. Mas em todos esses casos, B iniciou uma operação de "leitura" e deve esperar até que ela termine. Mas se B
for um comando de tal forma que precise apenas de saída parcial de A
, depois de um certo ponto em que B
s nível de entrada seja atingido A
será eliminado pelo SIGPIPE
Se A
tentar gravar no tubo e o tubo estiver cheio, A
deve esperar que algum espaço no tubo se torne livre. A
poderia ter o mesmo problema se estivesse gravando em um terminal. Um terminal tem controle de fluxo e pode moderar o ritmo dos dados. Em qualquer caso, 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 coprocessos, embora nem todos os coprocessos estejam se comunicando com um canal. Nenhum deles está no controle total do outro.