linux系統呼叫錯誤碼 errno

2021-09-19 17:29:54 字數 1318 閱讀 6103

為防止和正常的返回值混淆,系統呼叫並不直接返回錯誤碼,而是將錯誤碼放入乙個名為errno的全域性變數中。如果乙個系統呼叫失敗,你可以讀出errno的值來確定問題所在。

errno不同數值所代表的錯誤訊息定義在errno.h中,你也可以通過命令"man 3 errno"來檢視它們。

需要注意的是,errno的值只在函式發生錯誤時設定,如果函式不發生錯誤,errno的值就無定義,並不會被置為0。另外,在處理errno前最好先把它的值存入另乙個變數,因為在錯誤處理過程中,即使像printf()這樣的函式出錯時也會改變errno的值。

簡單的說,errno在標準c中是乙個整型變數,在errno.h中宣告,c標準庫中實現。多執行緒技術中,為了使errno執行緒安全,使用巨集定義替代了簡單的extern int errno宣告。

檢視錯誤**errno是除錯程式的乙個重要方法。當c api函式發生異常時,一般會將errno變數(需include errno.h)賦乙個整數值,不同的值表示不同的含義,可以通過檢視該值推測出錯的原因。

在/usr/include/asm/errno.h中有對應錯誤碼的定義

在系統程式設計中錯誤通常通過函式返回值來表示,並通過特殊變數errno來描述。

errno這個全域性變數在標頭檔案中宣告如下:extern int errno;

errno是乙個由posix和iso c標準定義的符號,看(用)起來就好像是乙個整形變數。當系統呼叫或庫函式發生錯誤的時候,比如以唯讀方式開啟乙個不存在的檔案時,它的值將會被改變,根據errno值的不同,我們就可以知道自己的程式發生了什麼錯誤,然後進行相應的處理。

為什麼,要強調errno看起來好像是乙個整形變數呢?因為有的標準(如iso c)只規定了errno的作用,而沒有規定它的實現方式,它可能被定義成乙個變數,也有可能被定義成乙個巨集,這個具體要看編譯器自己的實現。早些時候,posix.1曾把errno定義成extern int errno這種形式,但現在這種方式比較少見了。因為以這種形式來實現errno,在多執行緒環境下errno變數是被多個執行緒共享的,這樣可能執行緒a發生某些錯誤改變了errno的值,執行緒b雖然沒有發生任何錯誤,但是當它檢測errno的值的時候,執行緒b會以為自己發生了錯誤。所以現在errno在linux中被實現成extern int * __errno_location(void): #define errno (*__errno_location()),這樣每個執行緒都有自己的errno,不會再發生混亂了。

關於errno有三點需要特別注意:

綜上所述,當需要用errno來判斷函式是否正確執行的時候,最好先將errno清零,函式執行結束時,通過其返回值判斷函式是否正確執行,若沒有正確執行,再根據errno判斷時**發生了錯誤。

Linux錯誤碼編碼

翻譯professional linux kernel architecture 2.4.4 define max errno4095 0 4kib虛擬空間 ifndef assembly define is err value x unlikely x unsigned long max errn...

LoadLibrary 呼叫失敗錯誤碼記錄

在某些伺服器上,loadlibrary 函式會出現呼叫失敗的情況,以下是我的一些出錯經驗,希望能給其他人提供一些思路 1 確保該動態庫存在,防毒軟體有時會將庫檔案刪除 2 未指定呼叫路徑,直接呼叫,如 loadlibrary t dll 可以通過以下方法進行修改 tchar chcurdir max...

Linux錯誤碼以及exitCode

程式的優雅退出 linux錯誤碼 1 sighup 2 sigint 3 sigquit 4 sigill 5 sigtrap 6 sigabrt 7 sigbus 8 sigfpe 9 sigkill 10 sigusr1 11 sigse 12 sigusr2 13 sigpipe 14 sig...