我们正在将 C 应用程序从 Solaris 8 迁移到 Solaris 10。在 Solaris 10 上运行此代码时出现错误。我使用的是 32 位 gcc 编译器。

nFDs = ulimit(UL_GDESLIM, 0);
n=select(nFDs, &set, NULL, NULL, NULL);

错误:
Error : GetKey_(): select(): Invalid argument

我知道为什么会出现此错误,因为 nFDs 大于 1024。
以下来自 select.h
#ifdef  _LP64
#define  FD_SETSIZE      65536
#else
#define  FD_SETSIZE      1024

你能给我指点 ulimit(UL_GDESLIM, 0)select 是如何工作的,以及我需要修复哪个 header 吗?

最佳答案

从 Oracle 的文档来看,Solaris 遵循的最大文件描述符似乎存在“硬限制”。但是,可以通过将以下行添加到 /etc/system 并重新启动来更改此设置:

set rlim_fd_max = 65536

上面的行将硬限制设置为 65536。一旦设置了这个硬限制,您就可以使用 ulimit 内核函数调用更改此属性的“运行”值,或者如您在具有系统的 C 应用程序中所示调用 ulimit(...)select(...)

来源:
http://docs.oracle.com/cd/E19644-01/817-5051/pt_tuningos.html#wp57451

关于c - ulimit(UL_GDESLIM, 0) 和 select 如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19849217/

10-12 15:58