2009-07-27 81 views
1

我有一个长时间运行的进程,它监视系统并打印周期性日志。如果我让它运行超过10-15分钟,它将退出并显示一条消息: 打开的文件过多。在Linux中增加文件描述符的数量

该程序使用实时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 
+1

你肯定在某个地方泄漏。 – Joe 2009-07-27 16:33:59

+0

就像我在下面提到的,我没有正确关闭其中一个文件的流指针。我在fclose()被调用之前返回,如下所示: if(freq ==“1000000”) return 0; (频率==“1333000”) 返回1; else if(freq ==“1667000”) return 2; fclose(fp); 我把fclose放在if-else语句之前,它已经修复了。 – Dhruv 2009-07-27 18:17:05

回答

3

使用lsof的或调试器来查找文件的进程打开。增加限制只会延迟描述符用完的时间点。