6

Mac OS X で開くファイルの最大数のデフォルトの制限は 256 (ulimit -n) で、アプリケーションには約 400 のファイル ハンドラが必要です。

setrlimit() で制限を変更しようとしましたが、関数が正しく実行されたとしても、まだ 256 に制限されています。

私が使用するテストプログラムは次のとおりです。

#include <stdio.h>
#include <sys/resource.h>

main()
{
  struct rlimit rlp;

  FILE *fp[10000];
  int i;

  getrlimit(RLIMIT_NOFILE, &rlp);
  printf("before %d %d\n", rlp.rlim_cur, rlp.rlim_max);

  rlp.rlim_cur = 10000;
  setrlimit(RLIMIT_NOFILE, &rlp);

  getrlimit(RLIMIT_NOFILE, &rlp);
  printf("after %d %d\n", rlp.rlim_cur, rlp.rlim_max);

  for(i=0;i<10000;i++) {
    fp[i] = fopen("a.out", "r");
    if(fp[i]==0) { printf("failed after %d\n", i); break; }
  }

}

出力は次のとおりです。

before 256 -1
after 10000 -1
failed after 253

私のアプリケーションを使用する人に、/etc ファイルなどを突っ込むように頼むことはできません。それを自分で行うには、アプリケーションが必要です。

4

6 に答える 6

5

etresoft は、Appleディスカッション ボードで答えを見つけました。

ここでの問題は、printf() 関数にあります。printf() を呼び出すと、内部データ構造が特定のサイズに初期化されます。次に、setrlimit() を呼び出して、これらのサイズを調整しようとします。printf() でこれらの内部構造を既に使用しているため、その関数は失敗します。2 つの rlimit 構造 (1 つは前用、もう 1 つは後用) を使用し、setrlimit を呼び出すまでそれらを出力しない場合、コマンド ライン プログラムでも現在のプロセスの制限を変更できることがわかります。最大値は 10240 です。

于 2010-07-09T15:25:09.873 に答える
5

rlp.rlim_cur = 10000;

2つのこと。

1位。笑。Mac OS X の stdio にバグが見つかったようです。プログラムを修正し、エラー処理などを追加し、fopen() を open() syscall に置き換えると、10000 の制限に簡単に到達できます (これは、10.6.3 の OPEN_MAX 制限 10240 より 240 fds 下です)。

2番目。RTFM: man setrlimit. 最大オープン ファイルのケースは、OPEN_MAX に関して特に処理する必要があります。

于 2010-07-02T20:14:32.997 に答える
2

これは libc の厳しい制限かもしれません。一部のバージョンの solarisには、構造体にfdを as として格納するため、同様の制限があります。これがあなたのlibcにも当てはまる場合、あなたが望むことをすることができないかもしれません.unsigned charFILE

私の知る限り、次のようなものは、setrlimit開くことができるファイルの数にのみ影響しますopen( fopen はほぼ確実に実装されていますopen)。したがって、この制限が libc レベルにある場合は、別の解決策が必要になります。

もちろん、UNIX のほぼすべてのバリアントで利用可能なシステム コールを常に使用するfopenのではなく、代わりに使用することもできます。open

欠点は、バッファリングなどを行わない and の代わりに and を使用する必要があることです (これはすべて、OS 自体ではなく、libc で行われwriteますread) fwritefreadそのため、パフォーマンスのボトルネックになる可能性があります。

400 個のファイルを**同時に**開く必要があるシナリオについて説明できますか? それが必要な場合がないと言っているのではありません。ただし、ユースケースをより明確に説明していただければ、より良いソリューションをお勧めできるかもしれません。

于 2010-07-02T20:20:15.817 に答える
0

ばかげた質問に聞こえるかもしれませんが、同時に 400 個のファイルを開く必要があるでしょうか? ところで、このコードを root として実行していますか?

于 2010-07-02T15:17:17.673 に答える