2016-02-03 46 views
1

假設我有:如果我不關閉讀取結束或寫入結束管道,會發生什麼情況?

command1 | command2

忘了command2進程關閉寫入管道的結束。

如果是這樣,那麼command1將繼續閱讀命令2,因爲它不知道什麼時候停止閱讀?

如果我忘記讓command1進程關閉讀取管道的末端會發生什麼?

是否command2進程繼續等待某人閱讀,因爲它認爲某個進程正試圖從它讀取?

回答

0

我認爲你的輸入和輸出混淆了。

command1僅寫入命令2正在讀取的管道 - 當管道處於活動狀態(即command2尚未死亡或主動關閉其輸入描述符)時,command1將繼續嘗試將其輸出發送到那裏(或直到command1本身完成)。

如果command1完成並且它已經設法將其所有輸出發送到STDOUT(它是管道的輸入端),它將退出,並且管道的那端將被關閉。如果command2仍然從它的'STDIN(它是管道的輸出端)讀取數據,它將能夠獲取最後的數據,並將看到文件結束條件。

另一方面,如果command2在command1完成發送之前手動關閉它的輸入或退出,則下一次command1嘗試寫入STDOUT時,將出現「斷開管道」錯誤。

希望這可以清理一些東西。

+0

我相信問這個問題的人在想他們是否使用了'pipe()'系統調用,因爲他們詢問如果一個結束沒有關閉會發生什麼。 – user530873

相關問題