A única coisa sobre sua pergunta que se destaca como errada é que você diz
A seria executado primeiro, então B recebe o stdout de A
De fato, ambos os programas seriam iniciados praticamente ao mesmo tempo. Se não houver entrada para B
quando tentar ler, ele será bloqueado até que haja entrada para leitura. Da mesma forma, se não houver ninguém lendo a saída A
, suas gravações serão bloqueadas até que a saída seja lida (algumas delas serão armazenadas em buffer pelo canal).
A única coisa que sincroniza os processos que participam de um pipeline é a E / S, ou seja, a leitura e gravação no canal. Se nenhuma gravação ou leitura acontecer, os dois processos serão executados totalmente independentes um do outro. Se um ignorar a leitura ou gravação do outro, o processo ignorado bloqueará e, eventualmente, será morto por um SIGPIPE
sinal (se estiver gravando) ou obterá uma condição de fim de arquivo em seu fluxo de entrada padrão (se estiver lendo) quando o outro processo terminar .
A maneira idiomática de descrever A | B
é que é um pipeline contendo dois programas. A saída produzida na saída padrão do primeiro programa está disponível para ser lida na entrada padrão pelo segundo ("[a saída de] A
é canalizada para [a entrada de] B
"). A concha faz o encanamento necessário para permitir que isso aconteça.
Se você quiser usar as palavras "consumidor" e "produtor", suponho que tudo bem também.
O fato de serem programas escritos em C não é relevante. O fato de ser Linux, macOS, OpenBSD ou AIX não é relevante.