【发布时间】:2015-04-09 16:49:10
【问题描述】:
我的程序每 10 秒在指定目录中创建一个日志文件。然后在另一个线程中,它迭代该目录中的文件。如果文件有内容,则将其压缩并将其上传到外部存储,如果文件为空,则将其删除。程序运行一段时间后,我收到错误"too many open files" (gzopen failed, errno = 24)。
当我查看/proc/<pid>/fd 内部时,我看到许多指向创建日志的同一目录中的文件的断开链接以及链接旁边的单词(deleted)。
知道我做错了什么吗?我检查了两个线程中的返回值,close 函数(在写入日志的线程中)和boost::filesystem::remove(压缩和上传非空日志文件并删除空日志文件的线程)。所有的返回值都为零,而(deleted) 链接列表变得更长,每 10 秒购买 1 个。
我认为这个问题从未在 32 位上发生过,但最近我转向 64 位,现在我得到了这个惊喜。
【问题讨论】:
-
你关闭过文件吗?
-
我不仅关闭它们我还检查关闭函数的返回值,所有返回值都是零
-
你的testcase在哪里?来吧,你是一个长期的 SO 用户!
-
除非您发布更多代码,否则我们不知道如何为您提供帮助。
-
检查你的 ulimit -n 设置?您的新机器(64 位操作系统)的 ulimit 默认值可能与旧机器不同?