Satu-satunya hal tentang pertanyaan Anda yang salah adalah yang Anda katakan
A akan berjalan lebih dulu, lalu B mendapat stdout dari A
Faktanya, kedua program akan dimulai pada waktu yang hampir bersamaan. Jika tidak ada input B
ketika mencoba membaca, itu akan memblokir sampai ada input untuk dibaca. Demikian juga, jika tidak ada yang membaca output dari A
, maka penulisan akan memblokir sampai outputnya dibaca (beberapa akan buffered oleh pipa).
Satu-satunya hal yang menyinkronkan proses yang mengambil bagian dalam pipa adalah I / O, yaitu membaca dan menulis melintasi pipa. Jika tidak ada penulisan atau pembacaan terjadi, maka kedua proses akan berjalan sepenuhnya independen satu sama lain. Jika salah satu mengabaikan pembacaan atau penulisan yang lain, proses yang diabaikan akan memblokir dan akhirnya dibunuh oleh SIGPIPE
sinyal (jika menulis) atau mendapatkan kondisi file pada aliran input standar (jika membaca) ketika proses lain berakhir .
Cara idiomatis untuk menggambarkan A | B
adalah bahwa itu adalah pipa yang mengandung dua program. Output yang dihasilkan pada output standar dari program pertama tersedia untuk dibaca pada input standar oleh yang kedua ("[output] A
disalurkan ke [input] B
"). Shell melakukan plumbing yang diperlukan untuk memungkinkan hal ini terjadi.
Jika Anda ingin menggunakan kata "konsumen" dan "produsen", saya rasa itu juga tidak masalah.
Fakta bahwa ini adalah program yang ditulis dalam C tidak relevan. Fakta bahwa ini adalah Linux, macOS, OpenBSD atau AIX tidak relevan.