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 Bpodczas 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 SIGPIPEsygnał (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 | Bpolega 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] Ajest 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.