Linux中的套接字,线程和文件描述符

时间:2013-05-16 19:23:25

标签: linux multithreading sockets

我在为Linux编写的程序(某种服务器)时遇到了一些麻烦,我得到了臭名昭着的“太多打开文件”错误。

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

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

2 个答案:

答案 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)

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

无论如何......

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

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