"太多的打开文件"删除多个文件后出错

时间:2015-04-09 16:49:10

标签: c++ linux

我的程序在指定目录中每10秒创建一个日志文件。然后在另一个线程中,它迭代该目录中的文件。如果文件包含内容,则会将其压缩并将其上载到外部存储,如果文件为空,则将其删除。程序运行一段时间后,我收到错误"too many open files" (gzopen failed, errno = 24)

当我查看/proc/<pid>/fd时,我看到许多断开的链接指向创建日志的同一目录中的文件以及链接旁边的单词(deleted)

知道我做错了什么吗?我检查了两个线程中的返回值,close函数(在写入日志的线程中)和boost::filesystem::remove(压缩和上传非空日志文件并删除空的线程)日志文件)。所有返回值均为零,而(deleted)链接列表变长则每10秒购买1。

我认为这个问题从来没有发生在我的32位上,但最近我转移到了64位,现在我得到了这个惊喜。

1 个答案:

答案 0 :(得分:3)

您忽略了关闭您打开的文件。

根据您的描述,听起来像close您打开用于登录日志记录线程的文件,但在压缩和/或上传后,您继续说明了boost::filesystem::remove个文件。< / p>

请记住:

  • 您使用gzopen打开的所有压缩文件都必须为gzclose d
  • 您打开以压缩它的任何未压缩文件都必须关闭。
  • 如果您打开文件以检查它是否为空,则必须将其关闭。
  • 如果您打开要传输的文件,则必须将其关闭。

/proc/pid/fd的输出对缩小范围非常有帮助,但不幸的是你不发布它。看似无助的输出如何提供微妙的提示:

# You forgot to gzclose the output file after compressing it
l-wx------ user group 64 Apr 9 10:17 43 -> /tmp/file.gz (deleted)

# You forgot to close the input file after compressing it
lr-x------ user group 64 Apr 9 10:17 43 -> /tmp/file (deleted)

# You forgot to close the input file after logging
l-wx------ user group 64 Apr 9 10:17 43 -> /tmp/file (deleted)

# You forgot to close the input file after transferring it
lr-x------ user group 64 Apr 9 10:17 43 -> /tmp/file.gz (deleted)