2014-03-05 49 views
3

我真的不明白「關閉管道的寫入結束」和「不寫入任何東西到管道」之間的區別。如果我沒有寫入任何東西到管道中,並且管道是空的,爲什麼讀取端只是被阻塞而不是讀取EOF?與關閉寫入結束有什麼不同?只有當寫入結束時,管道的讀取結束纔會讀取EOF?

+3

好吧,想想它就像一個電話。只是因爲目前沒有人說什麼並不意味着他們不會很快開始。 EOF就像他們掛起。 – RedX

回答

7

從管道(或任何東西)讀取EOF表示沒有更多輸入,並且將來不會有任何輸入。

如果此時沒有可用輸入,但管道尚未關閉,則讀卡器將(默認情況下)阻止等待輸入;如果作者隨後寫入管道,那麼這些數據將會提供給讀者。 EOF會告訴讀者停止嘗試讀取更多數據。

+1

因此,EOF不像從管道中讀取的文字內容?這就像是當所有寫入結束都關閉時內核發送到讀取結束的信號? – Xufeng

+0

@旭峯:對。 EOF是C庫的一個組合值。它在操作系統中不存在。 –

+1

@旭峯:對。將其稱爲文件結束條件會更準確。它如何顯示取決於你如何從管道中讀取數據。如果使用'fgetc()',它將返回'EOF',這是一個與任何'unsigned char'值不同的負的'int'值。其他一些函數返回讀取的項目數量;例如,'read()'函數返回'0'來表示文件結束。 (或錯誤條件)。 –

0

這就是阻止文件描述符的協議。管道的讀取端等待的數據。關閉它的寫入結束信號表示流結束。這實際上是一個強大的同步概念。

您可以將管道切換到非阻塞模式,其中缺少數據被視爲軟錯誤,因此您可以檢查是否有任何要讀取的內容。當有多個文件描述符可以讀取時(如處理多個客戶端的服務器),這非常有用。這就是IO複用進來。