• 締切済み

fopenできる上限の変更

C言語のfopenで同時に開けるファイル数の上限を変える方法を教えてください。 3000個程度を超えると開けなくなりました。(戻り値がNULL) 自分としては512や2048以上のファイルを開けたことが不思議だったのですが・・・ 以下にOSのバージョンなどを書きます また、fopenで開けるファイル数の上限はどのようにして見ることができますか。(書かれている変数がありますか? あともうひとつ、 100万程度の大量のファイルを同時に開ける言語はありますか。 (OSの限度などは抜きにして。) よろしくお願いします。 ---- OSはDebian 4.0 コンパイラはgcc 4.1.2 /proc/sys/fs/file-max による上限は数十万でした。

みんなの回答

回答No.3

>質問の仕方で誤解を与えてしまったようですが、 >最大数が知りたいのです。 「処理系に依存するので不明」が答え。 ある処理系ではfopenが返すFILEポインタの実体が FILE __iob[FOPEN_MAX]; と定義されてて「どう足掻いても同時にはFOPEN_MAX個しか開けない」って制限があったりする(つまり、配列がFOPEN_MAX個しか無いから、配列の全要素を使い切ったら終り) ある処理系では、動的にFILEポインタを確保するので、ヒープメモリの上限に達するか、OSのリソースが尽きるまで同時にfopen出来る、と言う仕様になっていたりする。 で、OSにも「1つのプロセスで同時に開けるファイルの上限」があったり無かったりするので、Cのfopenライブラリの上限ではなく、OSの上限に引っ掛かったりもする。 そういう訳で「確実に同時オープン出来る事が保証されている最低の個数としてFOPEN_MAXが定義されている」だけで「本当に同時オープン出来るファイル数の上限は不明」としか言えない。 >あともうひとつ、 >100万程度の大量のファイルを同時に開ける言語はありますか。 >(OSの限度などは抜きにして。) 「OSの限度を抜きにする」と、質問自体が無意味になる。 なぜなら「ライブラリ関数で決められた上限に依存せずに大量のファイルを同時オープンするには、ライブラリ関数を使わず、直接、OSのファイルオープンを行う」と言う方法を取らざるを得ない。 そして、この方法は「直接OSのファイルオープンを行うのなら、言語に依存しない。その言語で、直接OSのファイルオープンを行う方法が用意されてさえ居れば良く、どの言語でも共通の話。依存するのはOSそのものの上限だけ」と言う事になる。 つまり「上限無しの方法を使うと、必然的に、OSそのものの上限に依存する」と言う事。 これは、質問者さんが提示した「OSの限度などは抜きにして」と言う前提に反する。 つまり「OSの限度などは抜きにして、と前提した事そのものが間違い」なのである。 OSの上限を抜きにして語れない話は、OSの上限は抜きにはできない。 そして、結論は「質問自体が無意味」となる。 唯一「OSの上限にさえ依存しない方法」として「記憶媒体に対し、OSを介さずに、直接アクセスする」と言う方法もあるが、それをやるには「OSのファイルシステムがやっている事と同一の事をすべて自前でやる事になる」ので非現実的。なのでこの方法は「無視」して「無かったこと」にする。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

fopenは内部でmallocをするので、決まった最大値というのはないでしょう。 ヒープの使用状況によってはあっさり開けなくなることもありそうです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

stdio.h を #include しておけば, 同時にオープンできるファイル数 (もともとオープンされている 3つの標準ストリームを含む) は FOPEN_MAX でわかります. でも, そんなに大量のファイルを「同時にオープンする」必要ありますか? プログラムの作りがおかしいような気もします.

goopth
質問者

補足

回答ありがとうございます。 FOPEN_MAXは同時に開けるファイルの最大数ではなくて 同時に開けることが保障されている最少のファイル数だったと記憶しています。 質問の仕方で誤解を与えてしまったようですが、 最大数が知りたいのです。 ちなみに私の環境の場合FOPEN_MAXは20でした。

関連するQ&A