linux open 文件時打開失敗的查找方法

原文鏈接:https://blog.csdn.net/buknow/article/details/95309823

 最近在一個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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章