在我使用select()
之前,我使文件描述符非阻塞?如何使用POSIX select()
3
A
回答
6
沒關係。
select
告訴你哪些套接字是可讀/可寫/關閉/有你感興趣的狀態。阻塞/非阻塞影響一個recv
或send
呼叫行爲。這些是彼此獨立的。
3
不管其用於監視的描述符的阻塞狀態如何,選擇本身都會阻塞。如果您不想選擇阻止,請使用超時0(即指向timeval結構爲零,而不是零指針)。
0
select
的目標是阻止,所以它會忽略非阻塞標誌。但是,如在the bugs section in the Linux manual pages中所述:
在Linux下,select()可能報告套接字文件描述符爲「準備好讀取」,而後續讀取塊。例如,這可能發生在數據到達但檢查錯誤校驗和並被丟棄時發生。可能有其他 情況,其中文件描述符虛假地報告爲 就緒。因此,在應該不會阻塞的套接字上使用O_NONBLOCK可能更安全。
因此,由於錯誤行爲,應該將文件描述符設置爲非阻塞。
相關問題
- 1. 如何使用JXA中的POSIX路徑
- 2. 如何使用S_ISREG()和S_ISDIR()POSIX宏?
- 3. 如何使用SELECT?
- 4. 如何實現基於POSIX select()的行爲,在boost :: asio
- 5. 如何使用select和stdout?
- 6. SELECT FOR XML,如何使用?
- 7. 如何使用SELECT DISTINCT
- 8. 如何使用SELECT DISTINCT
- 9. 如何在jQuery Datepicker中使用POSIX Timestamp格式來使用秒?
- 10. 使用POSIX從PHP,Windows
- 11. 使用posix semphores問題
- 12. HDFS如何放鬆POSIX
- 13. 使用STL/POSIX從J2SE加載二進制文件iphone使用STL/POSIX
- 14. 如何實現阻塞讀取使用POSIX線程
- 15. 如何在QT中使用QThreads實現POSIX消息傳遞?
- 16. 這是如何使用poll(2)的posix隊列?
- 17. C,如何在分叉進程上使用POSIX信號量?
- 18. 在Posix中,dev_t類型如何被使用?
- 19. 如何使用yum輕鬆地爲PHP添加posix支持?
- 20. 如何使用cygwin從posix切換到Windows
- 21. 如何在POSIX和Date對象上使用alignDaily?
- 22. 如何讓thread2在c中使用posix-threads等待thread1
- 23. 如何使用Esqueleto做一個「SELECT ... IN(SELECT ...)」?
- 24. 如何使用jQuery獲取select,然後設置select的值?
- 25. 如何使用LINQ做SELECT UNIQUE?
- 26. 如何在更新中使用select?
- 27. 如何使用mdl-select和md-option
- 28. 我如何使用SQL SELECT語句
- 29. 如何在MySQL中使用UPDATE SELECT
- 30. 如何在子SELECT中使用WHERE?
而如果代替套接字我有fd指向管道? – 2011-04-05 16:03:37
同樣的事情 - 讀寫受O_NONBLOCK影響,select不關心阻塞與否。 – Erik 2011-04-05 16:06:27
「無關緊要」在理論上是100%正確的,但在實踐中,您仍然應該使描述符不被阻塞,因爲在某些系統(例如Linux)上recv可能仍會阻塞,即使已經報告準備就緒。在文檔中給出的示例性情況是由於在就緒狀態已經發信號之後由於具有不正確的校驗和而丟棄的網絡分組。 – Damon 2011-04-05 17:20:46