我已經在線閱讀了一些關於套接字編程的資料。默認情況下,write()
被阻止。在某些材料中,當套接字緩衝區已滿時,write()
僅會阻止。一些其他材料說write()
被阻塞,直到用戶緩衝區中的所有數據已被移動到系統緩衝區,這意味着如果沒有足夠的空間放置數據,則write()
也會被阻止。我想知道如果write()
設置爲阻止哪個語句是正確的。非阻塞式寫入c
非阻塞式寫入c
回答
當描述符是套接字時,write函數的行爲與send()函數類似。如果內部緩衝區已滿並且可以發送所有數據,write()函數將會阻塞。這假定套接字被阻塞。請記住,寫入功能可能會被信號中斷; errno將被設置爲EINTR(返回值將是捕獲信號時寫入的字節數),並且可以再次調用write()直到發送所有數據。
參見
http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html http://pubs.opengroup.org/onlinepubs/009695399/functions/send.html
在上面發佈的send()函數的鏈接上,它表示如果發送套接字上的空間不可用來保存要發送的消息,並且套接字文件描述符沒有設置O_NONBLOCK,則send()應該阻塞直到空間可用。所以也許這就是你正在尋找的答案。至於「直到所有數據都可以發送」我寫道,我的意思是說,直到所有傳遞給write()函數的數據都寫入內部緩衝區。我爲寬鬆的語言表示歉意,並不是要誤導你。 –
在一些材料,寫()只塊時插座緩衝區已滿。其他一些材料說write()被阻塞,直到用戶緩衝區中的所有數據都被移動到系統緩衝區,這意味着如果沒有足夠的空間放置數據,write()也會被阻塞。
我不清楚這些實際上是在說什麼不同的東西。
首先,被稱爲「系統緩衝區」的是另一個被稱爲「套接字緩衝區」的東西,但它們是相同的東西。其次,當第一條語句表示「write()僅在套接字緩衝區已滿時阻塞」時,應將其解釋爲「write()僅在寫入操作溢出(系統)緩衝區時阻止」。這與「write()被阻塞直到用戶緩衝區中的所有數據已被移動到系統緩衝區」相同。它只是說一個條件會導致write()被阻塞,另一個說該條件會在條件變爲false時停止。這並不矛盾。
- 1. 非阻塞寫入和阻塞recv
- 2. UDP非阻塞式寫入失敗
- 3. 非阻塞式輸入python2.7
- 4. C#非阻塞Socket.Connect()
- 5. 非阻塞方式
- 6. mpi:阻塞與非阻塞
- 7. c中的非阻塞輸入
- 8. 非阻塞控制檯輸入C++
- 9. 在C++中正確寫入非阻塞套接字
- 10. C中的非阻塞sendmail
- 11. 非阻塞計時器C++
- 12. C#:非阻塞睡眠
- 13. C++非阻塞ASIO運行
- 14. PHP Inotify非阻塞方式
- 15. 非阻塞方式的Kombu
- 16. NIO非阻塞模式
- 17. 將OpenSSL BIO從阻塞模式更改爲非阻塞模式
- 18. 非阻塞django?
- 19. 非阻塞setTimeout
- 20. 非阻塞spmd
- 21. 非阻塞pthread_join
- 22. PyGTK非阻塞
- 23. Javascript非阻塞
- 24. 非阻塞stdio
- 25. 帶延遲的阻塞/非阻塞
- 26. 嵌套Socket阻塞非阻塞SocketHi
- 27. 非阻塞PASV襪子和阻塞
- 28. 是renderer.render()阻塞還是非阻塞?
- 29. 非阻塞鍵盤讀取 - C/C++
- 30. C/C++套接字和非阻塞recv()
是哪個插座?視窗? –
@o_weisman感謝您的回覆。 Linux系統。 – HuangJie
我建議你將問題的操作系統添加爲標籤。 – sjsam