繁体   English   中英

删除许多文件后出现“打开文件过多”错误

[英]“too many open files” error after deleting many files

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

当我查看/proc/<pid>/fd我看到在创建日志的同一目录中有许多断开的文件链接,链接旁有单词(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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM