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