删除多个文件后出现“打开的文件太多”的错误

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

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

任何想法我做错了什么? 我检查了两个线程, close函数(写入日志的线程)和boost::filesystem::remove (压缩并上传非空日志文件并删除空日志文件的线程)的返回值)。 所有的返回值都是零,而(deleted)链接的列表每10秒就会更长时间地买1。

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

你忽略关闭你打开的文件。

从你的描述来看,这听起来就像close了你打开的日志记录文件所打开的文件,但是你继续说你只是在压缩和/或上传之后boost::filesystem::remove文件。

请记住:

  • 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)