我在为Linux编写的程序中遇到了一些问题(某种服务器),我得到臭名昭着的“太多打开的文件”错误。Linux中的套接字,线程和文件描述符
到目前为止,我一直认为这是一个套接字问题,但经过更多的搜索之后,似乎线程在Linux中也是“文件”。
所以,插座和/或线程是否也需要文件描述符?
我在为Linux编写的程序中遇到了一些问题(某种服务器),我得到臭名昭着的“太多打开的文件”错误。Linux中的套接字,线程和文件描述符
到目前为止,我一直认为这是一个套接字问题,但经过更多的搜索之后,似乎线程在Linux中也是“文件”。
所以,插座和/或线程是否也需要文件描述符?
在一个典型的UNIX或类UNIX系统中,以下内容由一个文件描述符表示,并从用户角度看待(根据您可以使用的功能): 文件,管道,套接字(UNIX和网络套接字一样),字符设备,块设备。
从用户的角度和内核中,线程和进程都不被标识为文件。
问题是,在某些系统中,最小限制太低;因此将整个系统范围(实际上是用户范围或组范围)的更改设置为进程可以打开的上限;修改文件/etc/security/limits.conf
并添加以下行:
USER_NAME(软|硬)NOFILE(some_number_that_specifies_the_limit)
当然,如已经提到的,这可以在代码中使用该功能来设置的最大数量进行由调用进程打开的文件setrlimit
请注意,对任何资源设置硬限制时,需要使用root访问权限,同时使用ulimit命令设置软限制,或者代码中的功能通常不超过允许的硬限制。
关于你对线程的评论: 创建线程太多可能会导致失败,因为您正在使用的线程数量的限制或流程,您可以产卵,你会看到,例如fork
失败,并将errno设置为EAGAIN
如果不能得到一个新的过程;如文件限制,这可以使用setrlimit
函数进行更改。
但请注意,创建太多的线程与错误“太多打开的文件”无关。
Linux是unix的衍生产品,Unix系统从第1天开始的总体指导就是“一切都是文件”。几乎任何具有“open()”类型的调用都将返回某种类型的文件句柄。 –