システムを監視し、定期的なログを印刷する長時間実行プロセスがあります。10〜15分以上実行すると、開いているファイルが多すぎますというメッセージが表示されて終了します。
プログラムは、2秒ごとにSIGUSR1を発生させるリアルタイムtimer_create()およびtimer_settime()を使用してセットアップされます。ハンドラーには、子に1つのfork()-exec()があります。親に待機があり、その後のmmap()と、/ proc / acpi / battery/stateおよび/sys/ devices / system / cpu/cpu0に対するストリーム操作があります。 / 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