いつもこのサイトを参考にさせていただいています。
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: 同時に開けるファイル数について
C言語で同時に開くことができるファイルの最大個数は処理系依存になりますがFOPEN_MAX(又は_SYS_OPEN)の値によって左右されます。c言語ユーザ さんが書きました: C言語のfopenやopenにて、同時に開けるファイル数を調べているのですが、
どうもMS公式などWEBサイトでは255*255*。。。。 という表記を見るのですが、
などで開き続けると、47ファイル目でエラー(fd = -1)になります。
(fopenも同じです。)
この上限値はどこで決まっているのでしょうか?
この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)
これは
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: 同時に開けるファイル数について
ありがとうございます!なぞが解けました!
コンパイラ等にも依存するのですね。。。
もう1点だけ質問させてください。
TCPで通信するサーバプログラムを作っていまして、
acceptで動き出したタイミングでスレッド化して、マルチスレッドで
クライアントからのアクセスに答えるものを作っています。
その場合、ソケットをオープンすると、ファイルをオープンするのと同じことになると思います。
そうすると、47スレッドまでしか同時通信できないのですが、
それ以上ソケットを開く方法はないでしょうか。
TCP通信でクライアントからの大量アクセスをさばくにはどうしたら良いのでしょうか。
コンパイラ等にも依存するのですね。。。
もう1点だけ質問させてください。
TCPで通信するサーバプログラムを作っていまして、
acceptで動き出したタイミングでスレッド化して、マルチスレッドで
クライアントからのアクセスに答えるものを作っています。
その場合、ソケットをオープンすると、ファイルをオープンするのと同じことになると思います。
そうすると、47スレッドまでしか同時通信できないのですが、
それ以上ソケットを開く方法はないでしょうか。
TCP通信でクライアントからの大量アクセスをさばくにはどうしたら良いのでしょうか。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 同時に開けるファイル数について
ソケットのオープンはWinsock2の実装に支配されますので、調べてませんがもっと多いのでは?ただ、実用に成るレベルは分かりません。
それに対してfopenやopenの上限はC言語の標準ライブラリ実装に支配されます。なので試してないですが、gcc、borlandC++、VC++では上限が違うはずです。
それとWin32APIのファイルオープンであるCreateFileを使えば47の上限は超えれるはずです。
それに対してfopenやopenの上限はC言語の標準ライブラリ実装に支配されます。なので試してないですが、gcc、borlandC++、VC++では上限が違うはずです。
それとWin32APIのファイルオープンであるCreateFileを使えば47の上限は超えれるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。