最近在分析乙個偶現的問題,偶現概率特別低,問題還在分析中。把分析的知識做個總結,後面再繼續補充。
**在呼叫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 對映區的長...