Điều duy nhất về câu hỏi của bạn nổi bật là sai là bạn nói
A sẽ chạy trước, sau đó B nhận được thiết bị xuất chuẩn của A
Trên thực tế, cả hai chương trình sẽ được bắt đầu cùng một lúc. Nếu không có đầu vào B
khi nó cố đọc, nó sẽ chặn cho đến khi có đầu vào để đọc. Tương tự như vậy, nếu không có ai đọc đầu ra từ đó A
, ghi của nó sẽ chặn cho đến khi đầu ra của nó được đọc (một số sẽ được đệm bởi đường ống).
Điều duy nhất đồng bộ hóa các quy trình tham gia vào một đường ống là I / O, tức là đọc và viết trên đường ống. Nếu không có văn bản hoặc đọc xảy ra, thì hai quá trình sẽ chạy hoàn toàn độc lập với nhau. Nếu một người bỏ qua việc đọc hoặc ghi của người khác, quy trình bị bỏ qua sẽ chặn và cuối cùng bị giết bởi SIGPIPE
tín hiệu (nếu đang viết) hoặc nhận được một điều kiện cuối tập tin trên luồng đầu vào tiêu chuẩn của nó (nếu đọc) khi quá trình khác kết thúc .
Cách thành ngữ để mô tả A | B
là một đường ống chứa hai chương trình. Đầu ra được tạo ra trên đầu ra tiêu chuẩn từ chương trình đầu tiên có sẵn để được đọc trên đầu vào tiêu chuẩn bởi đầu vào thứ hai ("[đầu ra của] A
được dẫn vào [đầu vào của] B
"). Vỏ làm hệ thống ống nước cần thiết để cho phép điều này xảy ra.
Nếu bạn muốn sử dụng các từ "người tiêu dùng" và "nhà sản xuất", tôi cho rằng điều đó cũng ổn.
Thực tế là đây là những chương trình viết bằng C không liên quan. Thực tế rằng đây là Linux, macOS, OpenBSD hoặc AIX không liên quan.