2

我为 Linux(某种服务器)编写的程序遇到了一些问题,我收到了臭名昭著的“打开的文件太多”错误。

到目前为止,我一直认为这是一个套接字问题,但是经过更多搜索后,似乎线程在 Linux 眼中也是“文件”。

那么,套接字和/或线程也需要文件描述符是否正确?

4

2 回答 2

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函数来更改。

但是请注意,创建太多线程与错误“打开的文件太多”无关。

于 2013-05-16T19:48:49.140 回答
0

套接字肯定用文件句柄表示。我从来没有听说过有人提到线程是由文件句柄支持的,尽管这不会让我感到惊讶。

任何状况之下...

在启动程序之前,从 shell 中使用带有 -n 选项的ulimit命令。这将允许您提高最大文件限制。您还可以查看使用从代码中调用的setrlimit函数来执行相同的操作。

您没有进入太多细节,但是您是否有可能遇到太多文件限制,因为您的代码在使用完套接字和线程句柄后实际上并没有关闭它们?

于 2013-05-16T19:33:28.897 回答