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()rlimit2つの値を含む構造を返します。

  • カーネルが対応するリソースに適用する値である、と呼ばれる現在の制限。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
于 2013-03-25T08:37:00.267 に答える