Linux錯誤代碼:errno.h與返回值 -EINVAL

1.概述 

編寫Linux驅動,看見返回值爲 return -EINVAL” ,不是很清楚,特此查詢。

EINVAL 是定義在 errno.h 中的一個宏定義,它定義了一個整形變量(此處值爲22),是錯誤代碼的一個取值。EINVAL表示 無效的參數,即爲 invalid argument ,包括參數值、類型或數目無效等。

 

 2.錯誤代碼的概念

 錯誤(error )是指人們在使用軟、硬件的時候,軟、硬件不能正常操作的一種現象。由於錯誤的類型很多,爲了對錯誤進行區分,系統設定了錯誤代碼(error code),軟、硬件在運行中如果發生錯誤,將通過它內部的原有的設定判斷、識別而通過錯誤代碼的顯示方式給操作者,操作者通過錯誤代碼識別,快速找到軟、硬件不能正常操作的具體原因。

此處的錯誤代碼即爲在程序運行過程中,我們給不同類型的錯誤設定的一個唯一的編號,便於進行錯誤排除。

 

3. <errno.h>頭文件

errno.h 是C語言C標準函式庫裏的標頭檔,定義了通過錯誤代碼來回報錯誤資訊的宏。

errno.h 提供了一個整數全局變量errno,代碼是一個int型的值,extern int errno來聲明定義該錯誤值,errno 記錄系統的最後一次錯誤代碼。

當系統調用或者庫函數的錯誤事件發生時可修改errno值,以記錄錯誤的原因,該值可在任何需要的地方被修改;一般情況不爲0的值表示出現了異常或者錯誤。errno.h中定義了一系列的錯誤代碼,他們是以E開頭的宏定義。

早期的C標準(C89和C99)規定,<errno.h> 中至少要定義 EDOM、ERANGE、EILSEQ 三個宏,它們用來表示具體的錯誤代碼。在最新的 C11 標準中,將可移植的宏的個數擴展到了 78 個,其中包含了很多在 POSIX 環境中已經存在的名稱。

程序可能發生的錯誤有成百上千種,<errno.h> 實際定義的宏也不止標準庫裏定義的內容,這些宏隨不同的平臺、不同的庫實現而有所不同,依據這些宏編寫的代碼不具有跨平臺性

在筆者使用的Ubuntun系統中,<errno.h>頭文件位置如下:

可以在error-bash.h中找到-EINVAL的定義如下:

 

 4.“-EINVAL

在shell中執行man errno,可見errno的說明文檔。

在其中搜索 EINVAL ,結果如下:

可見,EINVAL是POSIX.1規範中的一個宏,系統定義了一系列這樣的錯誤代碼,通過這樣的宏可爲 errno 這個全局變量設置不同的值,即可表示不同類型的系統錯誤。

那爲什麼又在EINVAL前加一個負號呢?

通常,UNIX系統中,對系統API調用時如果返回0表示函數成功執行,返回-1則表示函數執行失敗;另一種錯誤返回方式就是通過返回不同的值來表徵錯誤的類型或程序退出的狀態,即可以通過返回不同的負值表徵不同的錯誤的類型。
這些錯誤碼都是定義的正值,即在正的錯誤碼前加一個負號,在錯誤處理時當返回值小於0時,我們再進一步檢測返回值的錯誤類型,因此就出現了“  return -EINVAL”

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章