(資料圖片僅供參考)
在處理一些程序出錯(cuò)語句中,不管是用戶空間還是內(nèi)核空間,通常都會(huì)返回一個(gè)錯(cuò)誤碼。例如return -ERROR
。
這些錯(cuò)誤碼是Linux內(nèi)核定義的,它幾乎包括了我們能想到的所有錯(cuò)誤類型。
錯(cuò)誤碼的定義位于:include/uapi/asm-generic/error-base.h
和include/uapi/asm-generic/error.h
兩個(gè)頭文件中。
其中error-base.h
定義了最常用的一些錯(cuò)誤,其余的錯(cuò)誤碼定義在error.h
中。
include/uapi/asm-generic/error-base.h
:
include/uapi/asm-generic/error.h
:
例如,返回一個(gè)IO
錯(cuò)誤,錯(cuò)誤碼是EIO
:
dev = init(&ptr);if(!dev)return -EIO
如果是對系統(tǒng)調(diào)用(read
、write
、ioctl
、mmap
等)的錯(cuò)誤處理,由于系統(tǒng)調(diào)用會(huì)陷入內(nèi)核,當(dāng)內(nèi)核空間出錯(cuò)時(shí), 錯(cuò)誤碼會(huì)自動(dòng)賦值給用戶空間的errno
變量,用戶空間調(diào)用strerror(errno)
可以將錯(cuò)誤轉(zhuǎn)為可讀字符串。例如:
#include < errno.h >/* 訪問errno全局變量 */#include < string.h >...if(write(fd, buf, 1)< 0) { printf("something gone wrong! %s\\n", strerror(errno));}...
錯(cuò)誤碼和goto
語句也是經(jīng)常一起出現(xiàn)的,當(dāng)遇到錯(cuò)誤時(shí),除了返回錯(cuò)誤碼,也 要把之前的所有初始化進(jìn)行撤銷,此時(shí)應(yīng)該用goto
語句,這在驅(qū)動(dòng)的入口函數(shù)中很常見。例如:
...ret = reset_control_deassert(phy- >reset);if (ret) goto err_reset;err_reset: clk_disable_unprepare(phy- >hsic_clk); return ret;...
標(biāo)簽: