假設我在包含一堆讀文件描述符的FD_SET上調用select()。如果在select()調用期間發生文件描述符關閉,會發生什麼情況?假設發生了某種錯誤,那麼是否有責任從集合中查找並移除關閉的文件描述符?Unix:在調用select()時關閉讀文件描述符會發生什麼()
9
A
回答
4
我不相信這是指定的任何地方;一些系統可能立即從select
返回,而其他系統可能會繼續阻止。請注意,這種情況發生的唯一方式是在多線程過程中(否則,close
在select
期間不會發生;即使它發生自信號處理程序,select
也會被信號中斷)。因此,這種情況可能表明你有更大的問題需要擔心。如果您正在輪詢的文件描述符中的一個可以在select
期間關閉,則更大的問題是相同的文件描述符可能會被重新分配給緊接在close
之後的新打開的文件(例如,在另一個不相關的線程中打開的文件)那麼輪詢可能會錯誤地在「屬於」另一個線程的新文件上執行IO。
如果你有一個由一組將與select
在多線程程序輪詢的文件描述符的數據對象,你幾乎肯定需要使用某種形式的同步原語來控制訪問該組,並加入或刪除文件描述符應該需要一個與select
(或成員上的任何IO)正在進行的可能性互斥的鎖。
當然,在多線程程序中,最好不要使用select
,而是讓多個線程中的IO阻塞,而不用複雜的鎖定邏輯來實現所需的結果。
1
select()
系統調用需要三個fd_set
參數:發送,接收,異常。要檢查,如果讀取文件描述符發生錯誤,請將其包含在讀取(接收)和錯誤(exceprion)集合中 - 在從select()
返回的異常集中查看它意味着該套接字發生異常,你有機會找出什麼。
一般來說,任何異常的網絡套接字將不再適合發送和接收。
1
即使您已經讀取了所有發送的數據,封閉的套接字始終被視爲可以讀取。選擇將解除阻塞,表明套接字可用。
相關問題
- 1. 關閉文件描述符
- 2. 什麼是關閉一個無效的文件描述符呢?
- 3. python關閉文件描述符問題
- 4. UNIX文件描述符重用
- 5. 如果關閉(2)單獨線程中的文件描述符,select(2)會做什麼?
- 6. 關閉原始文件描述符後,重複的描述符文件是否關閉?
- 7. Unix中的文件描述符幫助
- 8. 關閉文件描述符是怎麼回事?
- 9. 如何使用sdbus發送Unix文件描述符?
- 10. 什麼是文件描述符?
- 11. 複製文件失敗,EBADF關閉輸出文件描述符
- 12. 關閉文件指針而不關閉底層文件描述符
- 13. 用文件描述符調用dlopen?
- 14. 爲什麼ProtocolBuffers生成描述符?
- 15. fgets正在從關閉的文件描述符中讀取更多數據
- 16. 如何在python中關閉文件描述符?
- 17. 在子進程中關閉已打開的文件描述符
- 18. 在C中關閉管道,dup2,文件描述符?
- 19. 調用fdopen:壞的文件描述符
- 20. 文件描述符和系統調用
- 21. C++,如果文件在讀取時移動會發生什麼?
- 22. 當Android應用程序強行關閉時會發生什麼
- 23. 爲什麼stdio.h會打印寫入用文件描述符打開的文件?
- 24. 什麼是包描述符?
- 25. 什麼是描述符?
- 26. 關閉了一個名爲文件描述符
- 27. Linux內核 - 套接字文件描述符關閉位置
- 28. 如何通過Linux shell命令關閉文件描述符
- 29. 父/子進程關閉文件描述符
- 30. 錯誤的文件描述符關閉Boost套接字
請記住,當您在select()調用中時,駐留在fd_set中的filedescriptor的唯一可能方式可以關閉,如果另一個線程關閉()該描述符。 (有一個tcp連接被peer或你本地的tcp/ip棧關閉是另一回事)。 – nos 2012-04-06 16:46:18
另請參閱http://stackoverflow.com/questions/3884110/what-is-select-supposed-to-do-if-you-close-a-monitored-fd – 2012-04-06 18:13:36