我有一个长时间运行的过程,它监视系统并打印定期日志。如果我让它运行超过10-15分钟,它会退出并显示一条消息: 打开的文件太多了。
使用实时timer_create()和timer_settime()设置程序,每2秒引发一次SIGUSR1。在处理程序中,子中有一个fork() - exec()在父级中有一个等待,在/ 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
答案 0 :(得分:3)
使用lsof或调试器查找进程已打开的文件。增加限制只会延迟用完描述符的时间点。