linux open 文件时打开失败的查找方法

 最近在一个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深度的目录)。

        找到问题之后修改了下代码逻辑,句柄泄露的问题也就解决了!
————————————————
版权声明:本文为CSDN博主「n大橘为重n」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/buknow/article/details/95309823

你可能感兴趣的:(linux,oepn失败)