C语言中open失败,错误码24,错误描述:打开文件过多 Too many open files。句柄泄露问题

        最近在一个Linux项目的反馈中,有一个open失败的问题。场景是客户在识别很多次文件并导出时,发生了错误,根据我们的错误码定位到问题是出在一个open的地方,打开文件的时候失败,造成了不能正常生成文件,最后导致的错误。

        定位到问题后,根据open联想到是不是有open的文件没有关闭,导致句柄泄露的。因为用命令

ulimit -n

可以看到,在系统中默认的一个应用程序可以占用的句柄数是1024。然后就开始排查open的次数和close调用的次数是否一致,但运行起来之后发现调用次数完全一样,但还是识别到1000多次就挂掉了。正好是1000多次,说明确实是有别的地方在占用句柄,没有释放。用命令lsof确认了每执行一次识别导出就会造成一次句柄的泄露,所以继续定位。(命令的详细介绍参见 lsof

lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more

        我知道一般在C语言中有open、close、opendir、closedir对目录文件的操作会对文件句柄有影响。最终在查找的时候发现有opendir的操作之后,没有正常调用closedir。原来的代码逻辑是用opendir的方式打开目录,如果非空则递归调用opendir直到不能打开为止,这样的逻辑最终删除空文件夹时会造成opendir之后不能对应的closedir,最终导致的句柄泄露(幸亏open的是临时文件夹的1深度的目录)。

        找到问题之后修改了下代码逻辑,句柄泄露的问题也就解决了!

发布了87 篇原创文章 · 获赞 213 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/buknow/article/details/95309823