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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值