ファイルディスクリプタ


Cのプログラムで、あるディレクトリに256ファイル以上を書きこもうとするとopen errorになる、との相談を受けた。
結局何が問題だったかというと、違う階層で同じファイル名のファイルを二つ開き、閉じるのは一か所だけ、という使い方をしたいた為、
ファイルディスクリプタが枯渇してしまったのでした。

結論だけ述べると、なーんだ、という話ですが、今まで知らなかったコマンドも結構あったので、
結論に行きつくまでにググったことをメモ( ..)φメモメモ。

一つのディレクトリに置けるファイル数

MS-DOSの時代には1024個だかの制限があったようですが、対象となるディレクトリはxfsになので全く関係なし。
システムもext3だし。また、書き出しているファイルサイズも123kB程度で微々たるもの。

ファイルディスクリプタの上限

一つのプロセスが開けるファイル数の上限は、ulimitで確認できる。

# ulimit -n
1024

問題のマシンでは1024になっている。
ちなみにこれを変更したいときは /etc/rc.sysinit に追記してsysctl -p すればよいよう。

関連する情報へのリンク

と、ここまで調べて、、、

たぶん、fcloseを忘れてulimit -nの上限に引っ掛かてるのではないか、と推察する。
で、ファイルディスクリプタFILE *fp を、intで定義してやってprintfすると、見事1024個目でプロセスが落ちました。
うん、予想通り。質問者には、fcloseとfopenをgrepして、全部の対応関係を見れば?とのアドバイスにて終了。
そういや、fcloseallなる関数もあるらしい、と聞いた。使ったことないし使う気もないけど、スコープはどこまで効くんだろ。