使用errno檢測錯誤

2022-04-08 19:16:21 字數 808 閱讀 1279

下面使用errno進行錯誤處理是錯誤的。

/*呼叫庫函式*/

if (errno)

/*處理錯誤*/

原因:上面**的意圖是,呼叫庫函式失敗,則會設定非零errno,從而進行錯誤處理;呼叫成功,則不進行錯誤處理。

問題是,即使呼叫成功,也沒有強制要求將errno設定為0,即雖然呼叫庫函式成功,但是errno並不一定為0,可能是在呼叫庫函式之前errno就被設定為非零值了。

下面**仍然是錯誤的。

errno = 0;

/*呼叫庫函式*/

if (errno)

/*處理錯誤*/

原因:這段**在呼叫庫函式之前將errno設定為0,表面上看,如果呼叫庫函式成功,則不會處理錯誤。
問題在於,即使呼叫庫函式成功,errno也可能被設定為非零值。如fopen建立乙個檔案,
如果存在同名檔案,則先刪除再新建,不管成功建立與否,都可能會對是否存在同名檔案設定errno的值。
下面的**是正確的。
/*呼叫庫函式*/

if (返回的錯誤值)

檢查 errno

即我們只能根據返回的錯誤值來使用errno檢測發生了何種錯誤,但不能依靠errno判斷呼叫庫函式是否發生了錯誤。

一言以蔽之,不要用errno來判斷是否發生了錯誤,而是用它來檢測發生了何種錯誤。

關於 errno的使用

errno 是乙個全域性的變數,在 errno.h 中有它的定義 if defined mt defined dll defined mac crtimp extern int cdecl errno void define errno errno else ndef mt ndef dll crt...

linux系統呼叫錯誤碼 errno

為防止和正常的返回值混淆,系統呼叫並不直接返回錯誤碼,而是將錯誤碼放入乙個名為errno的全域性變數中。如果乙個系統呼叫失敗,你可以讀出errno的值來確定問題所在。errno不同數值所代表的錯誤訊息定義在errno.h中,你也可以通過命令 man 3 errno 來檢視它們。需要注意的是,errn...

Unix環境程式設計 錯誤資訊顯示 errno

系統庫函式中有這樣乙個整形變數errno,當呼叫unix系統庫函式出錯時,常常返回乙個負值,同時errno被設定為含有附加資訊的乙個值。注意,不是所有情況都是 標頭檔案中定義了errno以及可以賦予它的各種常量,這些常量都以字元 e 開頭。程式設計中通常使用到的庫函式為 perror和strerro...