0
int main()
{
    int err1, err2;
    struct rlimit rlim;

    err = getrlimit(RLIMIT_NOFILE, &rlim);
    printf("max_fds: %d\n", rlim.rlim_max); // 4096

    err1 = dup2(1, 1023);  // OK
    err2 = dup2(2, 4090);  // error: EBADF

    return 0;
}

像上面的代码一样,我使用 getrlimit 来获取每个进程的最大打开文件数,并打印 4096。但是,当我将大于 1023 的 newfd 传递到 dup2() 时,它总是返回错误 EBADF。为什么?

4

2 回答 2

1

你的平台有getdtablesize()吗?如果是这样,那就是看的地方。这可能是你对 fd 的真正限制。

于 2013-03-25T08:30:03.790 回答
1

getrlimit()返回一个rlimit包含两个值的结构:

  • 当前限制,称为,这是内核为相应资源强制执行的值rlim_cur
  • 最大限制,称为,它是无特权用户可以设置的rlim_max上限rlim_cur

tl;博士,使用rlim_cur

printf("max_fds: %d\n", rlim.rlim_cur); // probably 1024 by default on most distribs
于 2013-03-25T08:37:00.267 回答