點擊上方「嵌入式大雜燴」,「星標公眾號」第一時間查看精彩文章!
我們大多都使用printf來打印一些信息,其它的接口都比較少用。這里介紹一個被我們遺忘的打印輸出函數(shù):perror函數(shù)
。
perror函數(shù)簡介
perror(s) 用來將上一個函數(shù)發(fā)生錯誤的原因輸出到標準設備(stderr)。參數(shù) s 所指的字符串會先打印出,后面再加上錯誤原因字符串。此錯誤原因依照全局變量errno的值來決定要輸出的字符串。
在庫函數(shù)中有個errno變量,每個errno值對應著以字符串表示的錯誤類型。當你調用"某些"函數(shù)出錯時,該函數(shù)已經(jīng)重新設置了errno的值。perror函數(shù)只是將你輸入的一些信息和errno所對應的錯誤一起輸出。
下面通過例子看一下使用printf與使用perror的區(qū)別:
(1)使用printf的例子:
#include
int?main(void)
{
????FILE?*fp;
????fp?=?fopen("/home/book/test_file",?"r+");
????if?(NULL?==?fp)
????{
????????printf("fopen?error!\n");
????}
?
????return?0;
}
此時,我們本地的/home/book/路徑下并沒有test_file文件,編譯運行就會輸出錯誤信息:
(2)使用perror的例子:
#include
#include?
#include?
int?main(void)
{
????FILE?*fp;
????fp?=?fopen("/home/book/test_file","r+");
????if?(NULL?==?fp)
????{
????????perror("fopen?error");
????}
????return?0;
}
同上,編譯運行。此時會輸出錯誤信息:
可以看到,使用perror能多輸出點詳細信息。
前面說了,錯誤原因依照全局變量errno中。換句話說就是一些全局變量errno保存的就是一些錯誤代碼。我們可以看到在一些比較系統(tǒng)的代碼/工程中,常常會設計一些錯誤代碼,方便統(tǒng)一管理。
在Linux內(nèi)核(我這里的內(nèi)核版本是4.9.88)中,這些系統(tǒng)錯誤代碼在文件 include/uapi/asm-generic/errno-base.h
及 include/uapi/asm-generic/errno.h
中:
這些錯誤代碼后面有一些描述注釋,這些描述也不僅僅是作為注釋使用,也有與這些錯誤代碼建立一一對應的字符串輸出關系,比如:
所以才有了上例的No such file or directory
的輸出。
除此之外,我們也可以不去閱讀代碼,而是通過 errno
工具來查詢這些錯誤代碼及描述。
我們可以輸入errno
命令看看有沒有errno工具,如果沒有,則會提示安裝:
使用errno -l
命令查看系統(tǒng)錯誤代碼及描述:
以上就是本次的分享,如有錯誤,歡迎指出!謝謝
猜你喜歡
從串口驅動到Linux驅動模型
串口打印知多少?
1024G 嵌入式資源大放送!包括但不限于C/C++、單片機、Linux等。在公眾號聊天界面回復1024,即可免費獲??!
免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!