2013-03-25 27 views
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 。为什么?dup2()函数的max_fd数是多少?

回答

1

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

  • 电流限制,称为rlim_cur,这是值内核强制为相应的资源。
  • 最大值限制,称为rlim_max,这是无特权用户可以设置为rlim_cur的上限值。

tl; dr,使用rlim_cur

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

我喜欢你的:) – Coaku 2013-03-25 08:43:28

+0

哈哈,谢谢 – cmc 2013-03-25 08:46:16

1

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

+0

是的,它可以访问并显示1024,使程序吧:) – Coaku 2013-03-25 08:33:47

相关问题