2011-04-05 75 views

回答

6

沒關係。

select告訴你哪些套接字是可讀/可寫/關閉/有你感興趣的狀態。阻塞/非阻塞影響一個recvsend呼叫行爲。這些是彼此獨立的。

+0

而如果代替套接字我有fd指向管道? – 2011-04-05 16:03:37

+0

同樣的事情 - 讀寫受O_NONBLOCK影響,select不關心阻塞與否。 – Erik 2011-04-05 16:06:27

+0

「無關緊要」在理論上是100%正確的,但在實踐中,您仍然應該使描述符不被阻塞,因爲在某些系統(例如Linux)上recv可能仍會阻塞,即使已經報告準備就緒。在文檔中給出的示例性情況是由於在就緒狀態已經發信號之後由於具有不正確的校驗和而丟棄的網絡分組。 – Damon 2011-04-05 17:20:46

3

不管其用於監視的描述符的阻塞狀態如何,選擇本身都會阻塞。如果您不想選擇阻止,請使用超時0(即指向timeval結構爲零,而不是零指針)。

0

select的目標是阻止,所以它會忽略非阻塞標誌。但是,如在the bugs section in the Linux manual pages中所述:

在Linux下,select()可能報告套接字文件描述符爲「準備好讀取」,而後續讀取塊。例如,這可能發生在數據到達但檢查錯誤校驗和並被丟棄時發生。可能有其他 情況,其中文件描述符虛假地報告爲 就緒。因此,在應該不會阻塞的套接字上使用O_NONBLOCK可能更安全。

因此,由於錯誤行爲,應該將文件描述符設置爲非阻塞。