お世話になります。
共有ファイルの参照で困っております。
WindowsXP-64ビットの共有フォルダを
Windows7-64ビットから
accsesでファイルがあることを確認し
fopenで開くと、あるところ周辺で必ず、
EMFILE_Too many open files もしくは、EINVAL_Invalid argumentが
発生します。
開くファイルは数百個あり、連続して読み込んでいくのですが、
いつも同じファイルではなく、微妙に発生するファイル名は違います。
ファイルは開いて、読み終わったら、閉じてを1ファイルごとに行っており、
多くファイルを開いていることはありません。
失敗したときにSleep(1000)を入れ、タイミングずらすことで
4,5回リトライし、回避できます。
また、
Windows7-64ビット⇒WindowsXP-64ビットでは現象が発生するのですが
WindowsXP-64ビット⇒WindowsXP-64ビット、
WindowsXP-64ビット⇒Windows7-64ビット、
Windows7-64ビット⇒Windows7-64ビットでは現象は出ません。
windows7への移行で、現象が露呈しました。
開発環境は windows7-64ビットでvc2008です。
プログラム的に悪いのか、共有設定などが悪いのか
一切わかっておりません。
すみませんがアドバイスお願いします。
あんまり詳しくありませんが、FD(ファイルディスクリプタ)には上限があります。
条件によってはファイルを閉じても、どこかでキャッシュされているのかもしれませ
ん。
以下に似たような症状の報告がありました。
http://stackoverflow.com/questions/3184345/fopen-problem-too-many-open-files
他にも類似する報告も散見されますが、解決に至ったものはおおむね
1.C run-timeを使うな。Win32SDKないしMFCを使用せよ。
という方法によるもののようです。
以下のページでは _setmaxstdio へのリンクがありました。
http://newsgroups.derkeiler.com/Archive/Comp/comp.lang.ruby/2008-
01/msg03087.html
C run-timeでのFDの数を拡張できるようです。
うーーん、
仲澤さんの意見通りWIN32SDKまたはMFCを使うべきだと思います。
そもそも、fopenはMS-DOSとの互換性のためにある関数なので動作の保証がないと
思います。
あと、
>開くファイルは数百個あり、連続して読み込んでいくのですが、
数百個も連続して読み込むのは無理があると思います。
いくら上限がないにしても、20個ぐらいで区切って読み込むのがいいと思います。
追記、
> そもそも、fopenはMS-DOSとの互換性のためにある関数なので動作の保証がないと
> 思います。
CRT関数も大分改良されているみたいですね。
回答ありがとうございます。
ファイルの数が多いのは 重々承知しております。
苦しいところです。
fopenの件も、今後変更していこうと思います。
一応、対応策見つかったので 報告しておきます。
XPのパソコンで、「非ページプール割り当ての制限に達したため、サーバーはシステムの
非ページプールから割り当てることができませんでした。」なるエラーを出しているのを
発見し、少し調べて、てさぐりで
レジストリの
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lanmanserver\Parameters
のSizeを3にすることで、不具合が発生しないのを確認できました。
本来の解決方法ではないような気がしますが…
ありがとうございました。