我真的不明白「關閉管道的寫入結束」和「不寫入任何東西到管道」之間的區別。如果我沒有寫入任何東西到管道中,並且管道是空的,爲什麼讀取端只是被阻塞而不是讀取EOF?與關閉寫入結束有什麼不同?只有當寫入結束時,管道的讀取結束纔會讀取EOF?
回答
從管道(或任何東西)讀取EOF表示沒有更多輸入,並且將來不會有任何輸入。
如果此時沒有可用輸入,但管道尚未關閉,則讀卡器將(默認情況下)阻止等待輸入;如果作者隨後寫入管道,那麼這些數據將會提供給讀者。 EOF會告訴讀者停止嘗試讀取更多數據。
因此,EOF不像從管道中讀取的文字內容?這就像是當所有寫入結束都關閉時內核發送到讀取結束的信號? – Xufeng
@旭峯:對。 EOF是C庫的一個組合值。它在操作系統中不存在。 –
@旭峯:對。將其稱爲文件結束條件會更準確。它如何顯示取決於你如何從管道中讀取數據。如果使用'fgetc()',它將返回'EOF',這是一個與任何'unsigned char'值不同的負的'int'值。其他一些函數返回讀取的項目數量;例如,'read()'函數返回'0'來表示文件結束。 (或錯誤條件)。 –
這就是阻止文件描述符的協議。管道的讀取端等待的數據。關閉它的寫入結束信號表示流結束。這實際上是一個強大的同步概念。
您可以將管道切換到非阻塞模式,其中缺少數據被視爲軟錯誤,因此您可以檢查是否有任何要讀取的內容。當有多個文件描述符可以讀取時(如處理多個客戶端的服務器),這非常有用。這就是IO複用進來。
- 1. 如果我不關閉讀取結束或寫入結束管道,會發生什麼情況?
- 2. java.io.IOException - IO流結束讀取
- 3. IOException:讀取結束死亡
- 4. 當讀取int結束於C++
- 5. Mysterious =>從管道讀取時發生錯誤:管道已結束。 (109,0x6d)
- 6. 如何逐行讀取並檢測eof(文件結束)?
- 7. NodeJS - 寫入文件有時會結束
- 8. 如何在沒有輸入讀取時結束作業
- 9. 讀取結束XML文件中的PHP
- 10. MPI文件的讀取未結束
- 11. 大文件的性能讀取結束
- 12. C#讀取寫入文本文件結束在中東
- 13. c#如何結束流讀取器
- 14. 如何確定讀取結束
- 15. Shellscript不讀取結束大括號
- 16. 讀取數據開始到結束
- 17. 當管道讀取流寫入流時,聽寫嗎?
- 18. golang掃描器讀取直到讀取器結束
- 19. 閱讀直到頻道結束
- 20. 用fread讀取文件不會如預期的那樣結束
- 21. 如何修復ObjectInputStream和ObjectOutputStream的「寫入結束死亡」和「讀取結束死亡」錯誤?
- 22. 結束管道操作
- 23. 只有當madsed結束時才應用ng-mouseover?
- 24. fprintf vs WriteFile寫入管道:無法從所有管道讀取
- 25. 意外結束時,它不會結束
- 26. 在C中讀取/寫入UNIX管道
- 27. 如何多次寫入/讀取管道
- 28. 多線程:讀取/寫入管道
- 29. 處理FileStream不會結束異步讀取
- 30. 讀取tfrecord文件永遠不會結束
好吧,想想它就像一個電話。只是因爲目前沒有人說什麼並不意味着他們不會很快開始。 EOF就像他們掛起。 – RedX