【发布时间】:2009-07-27 16:20:09
【问题描述】:
我有一个长时间运行的进程,它监视系统并打印定期日志。如果我让它运行超过 10-15 分钟,它会退出并显示一条消息: 打开的文件太多。
该程序使用实时 timer_create() 和 timer_settime() 设置,每 2 秒引发一次 SIGUSR1。在处理程序中,子进程中有一个 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
【问题讨论】:
-
你肯定在某处泄漏。
-
就像我在下面提到的,我没有正确关闭文件的流指针之一。我在调用 fclose() 之前返回,如下所示: if(freq == "1000000") return 0;否则 if (freq == "1333000") 返回 1;否则 if (freq == "1667000") 返回 2; fclose(fp);我将 fclose 放在 if-else 语句之前,它已被修复。
标签: linux signals file-descriptor