Единственное, что в вашем вопросе является неправильным, так это то, что вы говорите
Сначала запускается A, затем B получает выход A
Фактически обе программы будут запущены практически одновременно. Если нет ввода для того, B
когда он пытается прочитать, он будет блокироваться до тех пор, пока нет ввода для чтения. Аналогично, если никто не читает выходные данные A
, их записи будут блокироваться до тех пор, пока их выходные данные не будут прочитаны (некоторые из них будут буферизованы каналом).
Единственное, что синхронизирует процессы, участвующие в конвейере, - это ввод-вывод, то есть чтение и запись по конвейеру. Если не происходит запись или чтение, тогда эти два процесса будут работать независимо друг от друга. Если один из них игнорирует чтение или запись другого, игнорируемый процесс блокируется и, в конечном счете, прерывается SIGPIPE
сигналом (при записи) или получает условие конца файла в своем стандартном входном потоке (при чтении), когда другой процесс завершается ,
Идиоматический способ описать A | B
это то, что это конвейер, содержащий две программы. Выходные данные, полученные на стандартном выходе первой программы, доступны для чтения на стандартном входе второй («[выходные данные] A
передаются на [входные данные] B
»). Оболочка выполняет необходимые сантехнические работы, чтобы это произошло.
Если вы хотите использовать слова «потребитель» и «производитель», я думаю, это тоже нормально.
Тот факт, что это программы, написанные на C, не имеет значения. Тот факт, что это Linux, macOS, OpenBSD или AIX, не имеет значения.