我在为Linux编写的程序(某种服务器)时遇到了一些麻烦,我得到了臭名昭着的“太多打开文件”错误。
到目前为止,我一直认为这是套接字的问题,但是,经过更多的搜索,似乎线程在Linux的眼中也是“文件”。
那么,套接字和/或线程是否也需要文件描述符?
答案 0 :(得分:4)
在典型的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
函数更改此内容。
但请注意,创建太多线程与“太多打开文件”错误无关。
答案 1 :(得分:0)