2010-03-17 69 views
0

我想用線程編寫客戶機/服務器程序。連接完成後關閉插座。服務器獲得了很多新的連接,並且套接字號(文件描述符)增加得非常快:運行5分鐘後,我已經處於800左右的文件描述符了!關閉套接字的問題

這是正常的事情嗎? 線程共享文件描述符嗎? 當我做close(sockfd);是立即發佈還是過了一段時間? PS:我曾經用fork()做過,而我沒有這個問題。 由於

+1

這是否真的會造成問題?你的代碼不工作?你爲什麼關心一個被實現定義的數字?如果你的系統隨機分配了文件描述符並給你123456789作爲文件描述符,你會怎麼做? – 2010-03-17 09:48:55

+1

@Adrien Plisson由於filedescriptors保證使用可用的最小編號。這意味着如果他獲得了800的新fds,他有800 fds打開,這可能表明資源泄漏 - 這是不好的。該fd號也直接映射到例如一個select()集合,這些位數是有限的 - 所以實際值很重要。 – nos 2010-03-17 10:02:46

+0

什麼操作系統?如果你在Linux上,你可以通過查看'/ proc//fd /'來查看這些文件描述符的全部內容。 – caf 2010-03-17 12:53:23

回答

1

文件描述符在所有線程中共享,因此在一個線程中關閉它會關閉所有其他線程。 close()方法釋放FD時,調用返回(除非出現錯誤)

注意,接近可以返回雖然錯誤:

不檢查關閉的返回值是一種常見的,但仍然嚴重的編程錯誤。先前寫入(2)操作中的錯誤很有可能在最後關閉時首先報告。在關閉文件時不檢查返回值 可能會導致數據無提示丟失。這可以通過NFS和磁盤配額來觀察。

檢查其他文件描述符的使用比你的套接字,也許你在其他地方泄漏fds - 例如,如果你打開正常的文件

2

pthreads(7)

POSIX.1還要求線程共享的範圍內其它 屬性(即,這些屬性是進程範圍,而不是每個線程):

  • 打開的文件描述符