【问题标题】:Increasing the number of file descriptors in Linux在 Linux 中增加文件描述符的数量
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 谢谢。我没有关闭 /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed 文件。运行 lsof +p . 清楚地表明了这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2011-04-10
  • 2017-07-23
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多