我想用線程編寫客戶機/服務器程序。連接完成後關閉插座。服務器獲得了很多新的連接,並且套接字號(文件描述符)增加得非常快:運行5分鐘後,我已經處於800左右的文件描述符了!關閉套接字的問題
這是正常的事情嗎? 線程共享文件描述符嗎? 當我做close(sockfd);
是立即發佈還是過了一段時間? PS:我曾經用fork()做過,而我沒有這個問題。 由於
我想用線程編寫客戶機/服務器程序。連接完成後關閉插座。服務器獲得了很多新的連接,並且套接字號(文件描述符)增加得非常快:運行5分鐘後,我已經處於800左右的文件描述符了!關閉套接字的問題
這是正常的事情嗎? 線程共享文件描述符嗎? 當我做close(sockfd);
是立即發佈還是過了一段時間? PS:我曾經用fork()做過,而我沒有這個問題。 由於
文件描述符在所有線程中共享,因此在一個線程中關閉它會關閉所有其他線程。 close()方法釋放FD時,調用返回(除非出現錯誤)
注意,接近可以返回雖然錯誤:
不檢查關閉的返回值是一種常見的,但仍然嚴重的編程錯誤。先前寫入(2)操作中的錯誤很有可能在最後關閉時首先報告。在關閉文件時不檢查返回值 可能會導致數據無提示丟失。這可以通過NFS和磁盤配額來觀察。
檢查其他文件描述符的使用比你的套接字,也許你在其他地方泄漏fds - 例如,如果你打開正常的文件
從pthreads(7)
:
POSIX.1還要求線程共享的範圍內其它 屬性(即,這些屬性是進程範圍,而不是每個線程):
- 打開的文件描述符
這是否真的會造成問題?你的代碼不工作?你爲什麼關心一個被實現定義的數字?如果你的系統隨機分配了文件描述符並給你123456789作爲文件描述符,你會怎麼做? – 2010-03-17 09:48:55
@Adrien Plisson由於filedescriptors保證使用可用的最小編號。這意味着如果他獲得了800的新fds,他有800 fds打開,這可能表明資源泄漏 - 這是不好的。該fd號也直接映射到例如一個select()集合,這些位數是有限的 - 所以實際值很重要。 – nos 2010-03-17 10:02:46
什麼操作系統?如果你在Linux上,你可以通過查看'/ proc//fd /'來查看這些文件描述符的全部內容。 –
caf
2010-03-17 12:53:23