【发布时间】:2013-05-18 05:03:36
【问题描述】:
我正在编写一个需要处理许多打开的套接字的服务器,所以我使用setrlimit() 来设置打开文件描述符的最大数量(作为 root,在删除权限之前),如下所示:
#include <sys/resource.h>
#define MAX_FD_C 9001
if (setrlimit(
RLIMIT_NOFILE, &(struct rlimit){.rlim_cur = MAX_FD_C, .rlim_max = MAX_FD_C}
) == -1) {
perror("Failed to set the maximum number of open file descriptors");
return EXIT_FAILURE;
}
现在,我意识到可能不会有任何保证,而且我受制于 Linux 内核用于实现文件描述符表的任何方法;但在实践中,假设这个程序从 Linux 内核接收到的任何 fd 的值都小于我上面设置的 MAX_FD_C 是否合理?
我想让每个套接字数据尽可能紧凑,这可能意味着简单地使用像 static struct client clients[MAX_FD_C] = {{0}}; 这样的数组并使用 fd 作为客户端结构的索引(这基本上是我自己的 FDT 版本) .
【问题讨论】:
-
是的,文件描述符将在 0
-
编程时不要假设任何事情。它让你活得更久。说真的。
-
@RandyHoward:我认为假设是保持我们理智和高效的必要条件。
-
您可以假设当代码不工作时会被要求修复的代码是由最初做出许多无根据假设的人编写的。 ;-)
-
嗯...至少我来到 SO 并在这里发布了我的问题,以便首先审查我的假设。此外,我尽可能避免假设,但在这种情况下,不假设将需要更大的数组,从而导致更多的缓存未命中,并且性能明显变差。这一切都是因为我只有 99.9% 的把握,而不是 100%。
Don't assume anything while programming. It makes you live longer.有计划地承担风险是什么让一个人成功并生活得更快乐?
标签: c linux linux-kernel file-descriptor setrlimit