1. 程式人生 > >fopen函式阻塞的排查

fopen函式阻塞的排查

在專案中使用了fopen函式阻塞現象,而且阻塞的時間很長(大概二十分鐘)

函式原型:FILE * fopen(const char * path, const char * mode);

fopen出現問題分析:

1 、引數path問題, 路徑不對fopen就會是返回失敗。

2、 引數mode問題,mode控制檔案開啟的方式,如果使用者開啟的方式超出了當前使用者的許可權,那麼fopen也會返回失敗,此時應該檢查當前使用者的操作許可權。

3 、檢查程式中是否有控制代碼洩露的可能即頻繁的呼叫fopen而沒有fclose,這種情況的表象就是前面剛剛開始的時候可以open成功,過一段時間後,怎麼都open不成功了,檢查路徑和許可權都沒有問題,那此時就要檢查下是否控制代碼洩露了。一般linux最多支援1000來個控制代碼,開啟太多不關,則其他的沒法打開了

4 、通過檢查errno來分析定位問題, errno是一個int型的值,在errno.h中定義不需要自己定義。可以通過strerror(errno)檢視錯誤資訊, errno是除錯程式的一個重要方法。

從分析可以看出長時間的阻塞並不是fopen產生的,在專案中出現的阻塞的原因是在使用fopen之前對系統執行了ifconfig命令修改了裝置的IP地址,nfs檔案系統出現了問題,mount的地址也就不存在,使得fopen無法發現nfs的檔案地址。