同時に開けるファイル数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
c言語ユーザ

同時に開けるファイル数について

#1

投稿記事 by c言語ユーザ » 14年前

いつもこのサイトを参考にさせていただいています。

C言語のfopenやopenにて、同時に開けるファイル数を調べているのですが、
どうもMS公式などWEBサイトでは255*255*。。。。 という表記を見るのですが、
実際に

for(i=0;i<50;i++){
printf("i - %d\n",i);
sprintf(buf,"sample%d.txt",i);
fd = open(buf, O_WRONLY | O_CREAT);

printf("ファイルディスクリプタ:%d\n", fd);
}

などで開き続けると、47ファイル目でエラー(fd = -1)になります。
(fopenも同じです。)

この上限値はどこで決まっているのでしょうか?
ご存知の方いらっしゃいましたら、教えて頂ければ助かります。


尚、環境はWindows XP SP3です。

アバター
bitter_fox
記事: 607
登録日時: 15年前
住所: 大阪府

Re: 同時に開けるファイル数について

#2

投稿記事 by bitter_fox » 14年前

c言語ユーザ さんが書きました: C言語のfopenやopenにて、同時に開けるファイル数を調べているのですが、
どうもMS公式などWEBサイトでは255*255*。。。。 という表記を見るのですが、

などで開き続けると、47ファイル目でエラー(fd = -1)になります。
(fopenも同じです。)

この上限値はどこで決まっているのでしょうか?
C言語で同時に開くことができるファイルの最大個数は処理系依存になりますがFOPEN_MAX(又は_SYS_OPEN)の値によって左右されます。

このFOPEN_MAXですが規格によると
JIS C (JIS X 3010-1993) 7.9.1 さんが書きました: FOPEN_MAXは、同時にオープンできることを処理系が保証するファイルの最小数を表す汎整数定数式に展開する。
と定められております。
つまり「この数以上のファイルを同時に開けるようにしてくださいね」ということです。
ですので、実際に何個のファイルを同時に開けるかは処理系によって変わってきます。

参考までに

コード:

Borland(5.5.1)
#define _NFILE_ 50
#if defined(__STDC__)
#define FOPEN_MAX (_NFILE_)
#else
#define FOPEN_MAX (_NFILE_)
#define SYS_OPEN  (_NFILE_)
#endif

質問者さんのプログラムの実行結果は
i - 0
ファイルディスクリプタ:3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
i - 46
ファイルディスクリプタ:49
i - 47
ファイルディスクリプタ:-1
となりました。

VisualStudio 2010 ExpressEdition
#define FOPEN_MAX       20
#define _SYS_OPEN       20

一方、こちらは
i - 0
ファイルディスクリプタ:3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
i - 2044
ファイルディスクリプタ:2047
i - 2045
ファイルディスクリプタ:-1
となりました。
(Windows 7)
双方において分かるのは3から始まっているということですね。
これは
0:標準入力
1:標準出力
2:標準エラー出力
に割り当てられてるためです。

恐らくマイクロソフトの表記はVCにおいては、もしくはWindows OSにおいては、という事ではないでしょうか?

http://x68000.q-e-d.net/~68user/cgi-bin ... =4103-4104
http://oshiete.goo.ne.jp/qa/5126169.html

http://59398.diarynote.jp/m/200410082159280000/?guid=ON
http://msdn.microsoft.com/ja-jp/library ... 80%29.aspx

http://www.ipa.go.jp/security/awareness ... 06_06.html

c言語ユーザ

Re: 同時に開けるファイル数について

#3

投稿記事 by c言語ユーザ » 14年前

ありがとうございます!なぞが解けました!
コンパイラ等にも依存するのですね。。。

もう1点だけ質問させてください。

TCPで通信するサーバプログラムを作っていまして、
acceptで動き出したタイミングでスレッド化して、マルチスレッドで
クライアントからのアクセスに答えるものを作っています。

その場合、ソケットをオープンすると、ファイルをオープンするのと同じことになると思います。
そうすると、47スレッドまでしか同時通信できないのですが、
それ以上ソケットを開く方法はないでしょうか。

TCP通信でクライアントからの大量アクセスをさばくにはどうしたら良いのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 同時に開けるファイル数について

#4

投稿記事 by softya(ソフト屋) » 14年前

ソケットのオープンはWinsock2の実装に支配されますので、調べてませんがもっと多いのでは?ただ、実用に成るレベルは分かりません。
それに対してfopenやopenの上限はC言語の標準ライブラリ実装に支配されます。なので試してないですが、gcc、borlandC++、VC++では上限が違うはずです。
それとWin32APIのファイルオープンであるCreateFileを使えば47の上限は超えれるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る