Sorunuzla ilgili yanlış görünen tek şey ,
A önce koşar, sonra B A'nın stdout'unu alır
Aslında, her iki program da hemen hemen aynı anda başlatılacaktı. Herhangi bir giriş varsa B
okunmaya çalıştığında okumak için giriş kalmayıncaya kadar, bu engeller. Benzer şekilde, çıktıyı okuyan kimse yoksa A
, yazıları okunana kadar bloke olur (bazıları boru tarafından arabelleğe alınır).
Bir boru hattında yer alan süreçleri senkronize eden tek şey I / O, yani boru boyunca okuma ve yazmadır. Yazma veya okuma olmazsa, iki süreç birbirinden tamamen bağımsız olarak çalışır. Biri diğerinin okumasını veya yazılmasını yoksayarsa, yoksayılan işlem SIGPIPE
, diğer işlem sonlandığında bir sinyalle (yazıyorsa) engellenir ve sonunda bir dosya tarafından sonlanır veya dosya sonu koşulu (okunuyorsa) elde edilir. .
Açıklamak için deyimsel yol, A | B
iki program içeren bir boru hattı olmasıdır. Birinci programdan standart çıktıda üretilen çıktı, ikinci girdi tarafından standart girdide okunabilir ("[çıktısı] A
[girdi] B
'ye bağlanır ). Kabuk bunun olmasını sağlamak için gerekli sıhhi tesisat yapar.
"Tüketici" ve "üretici" kelimelerini kullanmak istiyorsanız, sanırım bu da uygun
Bunların C dilinde yazılmış programlar olması önemli değildir. Bunun Linux, macOS, OpenBSD veya AIX olması önemli değildir.