2009-07-27 13 views
1

私はシステムを監視し、定期的なログを出力する長い実行プロセスを持っています。 10-15分以上実行すると、次のメッセージが表示されて終了します。 開いているファイルが多すぎます。Linuxのファイルディスクリプタの数を増やす

プログラムは、リアルタイムtimer_create()とtimer_settime()を使用してセットアップされ、2秒ごとにSIGUSR1が発生します。ハンドラには、子プロセスにfork() - exec()が1つあります。/ proc/acpi/battery/stateおよび/ sys/devices/system/cpu/cpu0の親プロセスとそれ以降のmmap()/cpufreq/scaling_cur_freqおよびscaling_setspeedファイル。 私は、周期的なシグナルハンドラと他のすべての場所でストリームFILE *ポインタを閉じるように注意しました。マップされたすべてのファイルのmunmap()も保証しました。

どうすればこの問題を回避できますか? ulimit -aSで表示される最大ファイル数を増やす必要がありますか? fclose()を使用してすべてのFILE *を閉じると、なぜこのようなことが起こりますか?

#cat /proc/sys/fs/file-max 
152808 

#ulimit -aS 
. 
. 
. 
. 
open files (-n) 1024 
+1

あなたは間違いなくどこかに漏れています。 – Joe

+0

私が以下に述べたように、ファイルのストリームポインタの1つを正しく閉じることができませんでした。 fclose()が呼び出される前に戻りました。 if(freq == "1000000") return 0; else if(freq == "1333000") return 1; else if(freq == "1667000") return 2; fclose(fp); if-else文の前にfcloseを置いて修正しました。 – Dhruv

答えて

3

使用lsofのか、あなたのプロセスを開いているファイルを見つけるために、デバッガ:ここ

は今のように私のシステムのための値です。制限を増やすと、ディスクリプタが不足するポイントが遅れるだけです。

+0

ありがとうございます。私は/ sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeedファイルを閉じていませんでした。これは、lsof + p を実行すると明確に示されています。 – Dhruv

関連する問題