2013-03-25 23 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

相關問題