fopen函式失敗原因分析以及分析原因的方法

2021-08-25 05:44:55 字數 1198 閱讀 8401

最近在分析乙個偶現的問題,偶現概率特別低,問題還在分析中。把分析的知識做個總結,後面再繼續補充。

**在呼叫lua的require函式時發生異常,通過檢視require的原始碼跟蹤,發現該函式的fopen函式返回開啟檔案失敗的異常,

下面就來總結下fopen開啟檔案出錯可能有哪些原因,也許不全,歡迎補充。

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

函式功能 開啟乙個檔案

引數:   path [in] 名稱   mode[in] 開啟方式

返回值:檔案順利開啟後,指向該流的檔案指標就會被返回。如果檔案開啟失敗則返回null,並把錯誤**存在errno 中。 

注:這裡只是簡單介紹下函式功能和引數,具體引數意思此處不分析。

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

分析:首先檢視path檔案是否存在,其次檢查path的路徑相對路徑還是絕對路徑?如果是相對路徑再檢查是否當前程序的目錄會切換了,軟體找不到檔案了.

如 相對路徑 file *fp = fopen(「./test/1.txt」, 「r」); 

絕對路徑 file *fp = fopen(「/mnt/text/1.txt」, 「r」);

假如確定引數path沒問題後,則可以排除檔案不存在的路徑問題。此時可以列印錯誤碼errno來定位問題(這個後面介紹)。

2 引數mode問題,mode控制檔案開啟的方式,如果使用者開啟的方式超出了當前使用者的許可權,那麼fopen也會返回失敗,

此時應該檢查當前使用者的操作許可權,也可以列印錯誤碼errno來定位問題

如果當前使用者僅僅只有讀的許可權而以讀寫的方式開啟檔案 file *fp = fopen(「./test/1.txt」, 「w+」)

3 檢查程式中是否有控制代碼洩露的可能即頻繁的呼叫fopen而沒有fclose,這種情況的表象就是前面剛剛開始的時候可以open成功

過一段時間後,怎麼都open不成功了,檢查路徑和許可權都沒有問題, 那此時就要檢查下是否控制代碼洩露了。一般linux最多支援1000來個

控制代碼,開啟太多不關,則其他的沒法開啟了

4 通過檢查errno來分析定位問題, errno是乙個int型的值,在errno.h中定義不需要自己定義。

可以通過strerror(errno)檢視錯誤資訊, errno是除錯程式的乙個重要方法。

注:errno 是記錄系統的最後一次錯誤**。

fopen開啟檔案失敗過程分析

場景說明 協助同事解決fopen開啟檔案永遠返回 1的異常情況。在解決問題的時候,先入為主的認為是 檔案路徑出現了字元轉義的問題,根本沒有想到要列印出當前無法獲取到檔案控制代碼的錯誤,是否是檔案路徑不存在。所以一開始就是將 替換為 然後替換為 還是不行。fprintf stderr,s n stre...

專案失敗原因分析

今天,x專案基本宣告失敗,這對我的人生是乙個比較重大的打擊。過去乙個人做專案,也遇到過失敗,但此次的失敗讓人覺得很無賴,讓我覺得根本無法控制與扭轉整個局面,並且我自己也精疲力盡,無力再堅持下去。1.x專案從一開始就有乙個致命的因素 面對的不是終端使用者,而是專案的轉包人。因此並不能與客戶直接溝通,不...

mmap函式及其對映失敗原因分析

mmap函式 標頭檔案 include 函式原型 void mmap void start,size t length,int prot,int flags,int fd,off t offset 引數 start 對映區的開始位址,設定為0時表示由系統決定對映區的起始位址。length 對映區的長...