我为 Linux(某种服务器)编写的程序遇到了一些问题,我收到了臭名昭著的“打开的文件太多”错误。
到目前为止,我一直认为这是一个套接字问题,但是经过更多搜索后,似乎线程在 Linux 眼中也是“文件”。
那么,套接字和/或线程也需要文件描述符是否正确?
我为 Linux(某种服务器)编写的程序遇到了一些问题,我收到了臭名昭著的“打开的文件太多”错误。
到目前为止,我一直认为这是一个套接字问题,但是经过更多搜索后,似乎线程在 Linux 眼中也是“文件”。
那么,套接字和/或线程也需要文件描述符是否正确?
在典型的 UNIX 或类 UNIX 系统中,以下内容由文件描述符表示,并且从用户的角度来看(根据您可以使用的功能):文件、管道、套接字(UNIX 和网络套接字) 、字符设备、块设备。
无论从用户的角度来看,还是在内核中,线程和进程都不会被标识为文件。
问题是在某些系统中,最低限制太低;因此要将系统范围(实际上是用户或组范围)更改设置为进程可以打开的上限;修改文件/etc/security/limits.conf
并添加以下行:
user_name (soft | hard) nofile (some_number_that_specifies_the_limit)
当然,正如已经提到的,这可以在代码中使用函数来设置调用进程setrlimit打开的最大文件数
请注意,对任何资源设置硬限制都需要 root 访问权限,而使用命令 ulimit 或代码中的函数设置软限制通常不会达到允许的硬限制。
关于您对线程的评论:创建太多线程可能会导致失败,因为您可以生成的线程或进程数量有限,例如,如果无法获得新进程,您会看到fork
将 errno 设置为失败;EAGAIN
就像在文件限制中一样,这可以使用setrlimit
函数来更改。
但是请注意,创建太多线程与错误“打开的文件太多”无关。