2013-05-16 150 views
2

我在爲Linux編寫的程序中遇到了一些問題(某種服務器),我得到臭名昭着的「太多打開的文件」錯誤。Linux中的套接字,線程和文件描述符

到目前爲止,我一直認爲這是一個套接字問題,但經過更多的搜索之後,似乎線程在Linux中也是「文件」。

所以,插座和/或線程是否也需要文件描述符?

+1

Linux是unix的衍生產品,Unix系統從第1天開始的總體指導就是「一切都是文件」。幾乎任何具有「open()」類型的調用都將返回某種類型的文件句柄。 –

回答

4

在一個典型的UNIX或類UNIX系統中,以下內容由一個文件描述符表示,並從用戶角度看待(根據您可以使用的功能): 文件,管道,套接字(UNIX和網絡套接字一樣),字符設備,塊設備。

從用戶的角度和內核中,線程和進程都不被標識爲文件。

問題是,在某些系統中,最小限制太低;因此將整個系統範圍(實際上是用戶範圍或組範圍)的更改設置爲進程可以打開的上限;修改文件/etc/security/limits.conf 並添加以下行:
USER_NAME(軟|硬)NOFILE(some_number_that_specifies_the_limit)

當然,如已經提到的,這可以在代碼中使用該功能來設置的最大數量進行由調用進程打開的文件setrlimit

請注意,對任何資源設置硬限制時,需要使用root訪問權限,同時使用ulimit命令設置軟限制,或者代碼中的功能通常不超過允許的硬限制。

關於你對線程的評論: 創建線程太多可能會導致失敗,因爲您正在使用的線程數量的限制或流程,您可以產卵,你會看到,例如fork失敗,並將errno設置爲EAGAIN如果不能得到一個新的過程;如文件限制,這可以使用setrlimit函數進行更改。

但請注意,創建太多的線程與錯誤「太多打開的文件」無關。

0

套接字絕對由文件句柄表示。我從來沒有聽到任何人提到線程支持文件句柄,儘管它不會讓我感到驚訝。

在任何情況下...

啓動程序前使用ulimit命令,從殼體-n選項。這將允許您提高最大文件限制。你也可以看看用你的代碼調用setrlimit函數來做同樣的事情。

您沒有涉及太多的細節,但是您是否可能遇到太多的文件限制,因爲當您完成使用它們時,實際上並沒有關閉套接字和線程句柄?

+0

嗨,謝謝你的回答,所以線程無法創建「太多打開的文件」的錯誤?這只是一個面向Socket的錯誤? – Ba7a7chy

相關問題