Lo único sobre su pregunta que se destaca como incorrecto es que usted dice
A correría primero, luego B obtiene el stdout de A
De hecho, ambos programas se iniciarían casi al mismo tiempo. Si no hay entrada para B
cuando intenta leer, se bloqueará hasta que haya entrada para leer. Del mismo modo, si no hay nadie que lea la salida A
, sus escrituras se bloquearán hasta que se lea su salida (parte de la tubería se amortiguará).
Lo único que sincroniza los procesos que participan en una tubería es la E / S, es decir, la lectura y escritura a través de la tubería. Si no ocurre escritura o lectura, entonces los dos procesos se ejecutarán de manera totalmente independiente el uno del otro. Si uno ignora la lectura o escritura del otro, el proceso ignorado se bloqueará y eventualmente será eliminado por una SIGPIPE
señal (si está escribiendo) u obtendrá una condición de fin de archivo en su flujo de entrada estándar (si está leyendo) cuando el otro proceso finalice .
La forma idiomática de describir A | B
es que es una tubería que contiene dos programas. La salida producida en la salida estándar del primer programa está disponible para ser leída en la entrada estándar por el segundo ("[la salida de] A
se canaliza a [la entrada de] B
"). El shell realiza las tuberías necesarias para permitir que esto suceda.
Si desea utilizar las palabras "consumidor" y "productor", supongo que también está bien.
El hecho de que se trate de programas escritos en C no es relevante. El hecho de que esto sea Linux, macOS, OpenBSD o AIX no es relevante.