Pipe
理解 Unix/Linux 中的管道命令
我有兩個簡單的程序:
A
和B
.A
將首先執行,然後B
獲取“stdout”A
並將其用作其“stdin”。假設我使用的是 GNU/Linux 作業系統,最簡單的方法是:./A | ./B
如果我必須描述這個命令,我會說它是一個從生產者( )獲取輸入(即讀取
A
)並寫入消費者(B
)的命令。這是正確的描述嗎?我錯過了什麼嗎?
關於你的問題唯一突出的錯誤是你說
A 將首先執行,然後 B 獲得 A 的標準輸出
事實上,這兩個程序幾乎同時啟動。如果在嘗試讀取時沒有輸入
B
,它將阻塞,直到有輸入要讀取。同樣,如果沒有人從 讀取輸出A
,它的寫入將阻塞,直到它的輸出被讀取(其中一些將被管道緩衝)。唯一使參與管道的程序同步的是 I/O,即跨管道的讀取和寫入。如果沒有寫入或讀取發生,那麼這兩個程序將完全獨立執行。如果一個忽略另一個程序的讀取或寫入,則被忽略的程序將阻塞並最終被
SIGPIPE
信號殺死(如果寫入)或在另一個程序終止時在其標準輸入流(如果讀取)上獲得文件結束條件.描述的慣用方式
A | B
是它是一個包含兩個程序的管道。第一個程序在標準輸出上產生的輸出可供第二個程序在標準輸入上讀取 ("$$ the output of $$
A
被輸送到$$ the input of $$B
”)。外殼會執行所需的管道以允許這種情況發生。 如果您想使用“消費者”和“生產者”這兩個詞,我想也可以。這些是用 C 編寫的程序這一事實無關緊要。這與 Linux、macOS、OpenBSD 或 AIX 無關。