Jedyną rzeczą w twoim pytaniu, która wyróżnia się jako błędna, jest to, że mówisz
Najpierw biegnie A, a następnie B dostaje stdout A
W rzeczywistości oba programy byłyby uruchamiane prawie w tym samym czasie. Jeśli nie ma danych wejściowych B
podczas próby odczytu, będzie blokowany, dopóki nie będzie danych wejściowych do odczytu. Podobnie, jeśli nikt nie odczytuje danych wyjściowych A
, zapisy będą blokowane, dopóki dane wyjściowe nie zostaną odczytane (część zostanie buforowana przez potok).
Jedyne, co synchronizuje procesy biorące udział w potoku, to operacje we / wy, tj. Odczyt i zapis w poprzek potoku. Jeśli nie nastąpi pisanie ani czytanie, oba procesy będą działać całkowicie niezależnie od siebie. Jeśli jeden zignoruje odczyt lub zapis drugiego, zignorowany proces zostanie zablokowany i ostatecznie zostanie zabity przez SIGPIPE
sygnał (w przypadku zapisu) lub otrzyma warunek końca pliku w swoim standardowym strumieniu wejściowym (w przypadku odczytu) po zakończeniu drugiego procesu .
Idiomatyczny sposób opisania A | B
polega na tym, że jest to potok zawierający dwa programy. Wyjście wytworzone na standardowym wyjściu z pierwszego programu jest dostępne do odczytu na standardowym wejściu przez drugi („[wyjście z] A
jest przesyłane do [wejście z]] B
). Powłoka wykonuje wymagane czynności hydrauliczne, aby to umożliwić.
Jeśli chcesz użyć słów „konsument” i „producent”, to chyba też jest w porządku.
Fakt, że są to programy napisane w C, nie ma znaczenia. Fakt, że jest to Linux, macOS, OpenBSD lub AIX, nie ma znaczenia.