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。为什么?

最佳答案

getrlimit()返回包含两个值的结构:
当前限制,称为rlimit,它是内核对相应资源强制执行的值。
最大限制,称为rlim_cur,这是一个未被授权的用户可以设置rlim_max的上限值。
tl;dr,使用rlim_cur

printf("max_fds: %d\n", rlim.rlim_cur); // probably 1024 by default on most distribs

关于c - dup2()函数的max_fd数是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15610427/

10-11 23:19