天天看點

C語言系統錯誤資訊

       我們在寫程式的時候需要調用C語言提供的庫函數,并通過函數的傳回值判斷調用是否成功。其實在C語言中,還有一個全局變量errno,存放了函數調用過程中産生的錯誤碼。

       為防止和正常的傳回值混淆,庫函數的調用一般并不直接傳回錯誤碼,而是将錯誤碼(是一個整數值,不同的值代表不同的含義)存入一個名為 errno 的全局變量中,errno 不同數值所代表的錯誤消息定義在 <errno.h> 檔案中。如果庫函數調用失敗,可以通過讀出 errno 的值來确定問題所在,推測程式出錯的原因,這也是調試程式的一個重要方法。

       配合 strerror和perror兩個庫函數,還可以很友善地檢視出錯的詳細資訊。

       strerror 在 <string.h> 中聲明,用于擷取錯誤碼對應的消息描述。

       perror 在 <stdio.h> 中聲明,用于在螢幕上最近一次系統錯誤碼及其消息描述,在實際開發中,我們寫的程式運作于背景,在螢幕上顯示錯誤資訊沒有意義。

strerror函數

       函數聲明:

              char *strerror(int errno);

       函數說明:strerror()用來依參數errno 的錯誤代碼來查詢其錯誤原因的描述字元串,然後将該字元串指針傳回。

       傳回值:傳回描述錯誤原因的字元串位址。

       在gcc4.4.7版本中,定義了131個錯誤代碼,我們用程式把它們全部顯示出來。

       示例(book158.c)

C語言系統錯誤資訊

       輸出結果

C語言系統錯誤資訊
C語言系統錯誤資訊

一共有131個錯誤代碼和描述,上面的截圖隻顯示了前5條和最後5條。這些錯誤代碼和描述看一下就行了,不需要記住。

errno的細節

1、調用庫函數失敗不一定會設定errno

       如果庫函數調用失敗,庫函數會設定errno的值,程式員通過 errno 的值來判斷出錯的具體原因,但是,并不是全部的庫函數在調用失敗時都會設定errno的值,那麼,哪些庫函數會設定errno的值呢,要看函數的說明,例如fopen函數,在指令行下輸入man fopen,在諸多的文字中,有以下行說明文字。

              The fopen() function may also fail and set errno for any of the errors specified for the routine open(2).

       不屬于系統調用的函數不會設定errno,屬于系統調用的函數才會設定errno。

2、errno不能作為調用庫函數失敗的标志

       在 C 語言中,如果庫函數被正确地執行,那麼 errno 的值不會被清零。換句話說,errno 的值隻有在一個庫函數調用發生錯誤時才會被設定,當庫函數調用成功運作時,errno 的值不會被修改,當然也不會主動被置為 0。也正因為如此,在實際程式設計中,判斷函數執行是否成功還得靠函數的傳回值,隻有在傳回值是失敗的情況下,才需要關注errno的值。

3、程式員可以不用errno

       關注errno的目的是為了擷取更詳細錯誤資訊,這些錯誤資訊對程式員診斷程式可能會有幫助,但不是必須的。

       示例(book160.c)

C語言系統錯誤資訊

       運作結果

C語言系統錯誤資訊

版權聲明

作者:碼農有道

繼續閱讀