สิ่งเดียวที่เกี่ยวกับคำถามของคุณที่โดดเด่น ผิดคือคุณพูด
A จะทำงานก่อนจากนั้น B จะได้ stdout ของ A
ในความเป็นจริงทั้งสองโปรแกรมจะเริ่มในเวลาเดียวกัน หากไม่มีอินพุตสำหรับB
เมื่อพยายามอ่านข้อมูลจะถูกปิดกั้นจนกว่าจะมีการป้อนข้อมูลให้อ่าน ในทำนองเดียวกันหากไม่มีใครอ่านเอาต์พุตจากA
การเขียนของมันจะบล็อกจนกว่าจะมีการอ่านเอาต์พุต (บางส่วนจะถูกบัฟเฟอร์โดยไพพ์)
สิ่งเดียวที่ซิงโครไนซ์กระบวนการที่มีส่วนร่วมในไพพ์ไลน์คือ I / O คือการอ่านและการเขียนข้ามไพพ์ หากไม่มีการเขียนหรือการอ่านเกิดขึ้นกระบวนการทั้งสองจะทำงานโดยอิสระจากกัน หากผู้ใดเพิกเฉยต่อการอ่านหรือการเขียนของอีกฝ่ายกระบวนการที่ถูกเพิกเฉยจะบล็อกและในที่สุดก็ถูกสังหารโดยSIGPIPE
สัญญาณ (ถ้าการเขียน) หรือรับเงื่อนไขสิ้นสุดไฟล์ในกระแสอินพุตมาตรฐาน (ถ้าอ่าน) เมื่อกระบวนการอื่นสิ้นสุดลง .
วิธีการอธิบายที่ใช้สำนวนA | B
คือมันเป็นขั้นตอนที่มีสองโปรแกรม เอาต์พุตที่สร้างจากเอาต์พุตมาตรฐานจากโปรแกรมแรกพร้อมที่จะอ่านบนอินพุตมาตรฐานโดยที่สอง ("[เอาต์พุตของ] A
ถูกไพพ์ลงใน [อินพุตของ] B
") เชลล์ทำหน้าที่วางท่อประปาเพื่อให้สิ่งนี้เกิดขึ้น
หากคุณต้องการใช้คำว่า "consumer" และ "โปรดิวเซอร์" ฉันก็ถือว่าใช้ได้เช่นกัน
ความจริงที่ว่าเหล่านี้เป็นโปรแกรมที่เขียนใน C ไม่เกี่ยวข้อง ความจริงที่ว่านี่คือ Linux, MacOS, OpenBSD หรือ AIX ไม่เกี่ยวข้อง