2013-05-16 149 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

相关问题