在編程中,我們一般都是要講究一定的使用規(guī)范的。按照一定的規(guī)范編寫(xiě)代碼,返回運(yùn)行提示,在代碼運(yùn)行出現(xiàn)問(wèn)題時(shí)能方便我們能快速的定位到問(wèn)題的所在。
特別是在使用庫(kù)函數(shù)或者系統(tǒng)調(diào)用的API的時(shí)候,我們最好也要關(guān)注函數(shù)的返回值所能給我們提供的信息,充分利用好這些返回值以及返回值所代表的含義,對(duì)我們的錯(cuò)誤查找是有很大的便利的!
本文記錄一下文件IO操作時(shí)的一些錯(cuò)誤提示,通過(guò)函數(shù)的調(diào)用之后的返回值去查找對(duì)應(yīng)的問(wèn)題。
有關(guān)文件IO的 errno 變量
在linux系統(tǒng)中對(duì)于常見(jiàn)的錯(cuò)誤都進(jìn)行了統(tǒng)計(jì),這些不同的錯(cuò)誤已經(jīng)被系統(tǒng)進(jìn)行了編號(hào),并且每個(gè)錯(cuò)誤類型的編號(hào)都不一樣,以此來(lái)區(qū)分不同的錯(cuò)誤類型。
errno實(shí)際上是一個(gè)int型的全局變量,它存儲(chǔ)的是當(dāng)前執(zhí)行函數(shù)所發(fā)生的錯(cuò)誤編號(hào),如果這個(gè)錯(cuò)誤在被記錄時(shí)沒(méi)有被及時(shí)的訪問(wèn),那么會(huì)被下一次發(fā)生的錯(cuò)誤編號(hào)所覆蓋掉。
但是有一點(diǎn)是要注意的,不是所有的庫(kù)函數(shù)或者系統(tǒng)調(diào)用都會(huì)有錯(cuò)誤碼返回的,關(guān)于這邊要去查詢所調(diào)用的函數(shù)說(shuō)明才能知道。比如我想知道函數(shù) open 是否會(huì)返回錯(cuò)誤碼,那就可以使用 man 2 open 進(jìn)行查看,如下:
從圖中可以看出,open函數(shù)在調(diào)用出現(xiàn)異常的時(shí)候會(huì)設(shè)置errno變量的。
C庫(kù)函數(shù) strerror( )
雖然我們知道了通過(guò)errno變量可以獲取到函數(shù)調(diào)用出現(xiàn)錯(cuò)誤時(shí)的錯(cuò)誤編號(hào)。但是錯(cuò)誤編號(hào)它只是一個(gè)數(shù)字,對(duì)于我們而言光是知道一個(gè)數(shù)字總歸是差點(diǎn)意思的。
而我們最終是希望通過(guò)這個(gè)數(shù)字獲取到有關(guān)的錯(cuò)誤原因或者某種提示,這才是我們查找問(wèn)題的好幫手啊。
這個(gè)時(shí)候我們可以考慮使用一個(gè)C庫(kù)函數(shù)— strerror()。通過(guò)這個(gè)函數(shù)將我們代碼中獲取到的錯(cuò)誤編碼轉(zhuǎn)換成對(duì)應(yīng)的字符串輸出,讓我們能夠看的明白錯(cuò)誤是怎么回事。
strerror()函數(shù)的原型如下:
#include
char*strerror(int errnum);
參數(shù)和返回值如下:
errnum :錯(cuò)誤編號(hào) errno。
返回值:對(duì)應(yīng)錯(cuò)誤編號(hào)的字符串描述信息。
比如:我調(diào)用open函數(shù)以只讀的方式打開(kāi)一個(gè)不存在的文件,并打印變量errno的值,然后轉(zhuǎn)換成字符串輸出,看看是什么效果。
代碼如下:
#include
#include
#include
#include
#include
#include
#include
intmain(void)
{
char buf[1024];
int fd_src;
fd_src =open("./xxxx.txt",O_RDONLY);
if(fd_src <0)
{
printf("errno:%d Info:%s\\r\\n",errno,strerror(errno));
return-1;
}
close(fd_src);
}
運(yùn)行之后的輸出結(jié)果如下:
從圖上可以看出來(lái),因?yàn)閤xxx.txt這個(gè)文件是不存在的,用open函數(shù)的只讀的方式打開(kāi)的話,會(huì)返回錯(cuò)誤編號(hào)2,通過(guò)strerror函數(shù)返回的錯(cuò)誤信息是“No such file or directory”,說(shuō)的是找不到這個(gè)文件。
當(dāng)然,除了strerror函數(shù)之外,還有一個(gè)函數(shù)也是實(shí)現(xiàn)一樣的效果的,那就是perror,這個(gè)函數(shù)會(huì)自動(dòng)附加一些信息輸出,可以更加方便我們輸出調(diào)試查看信息!
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
591瀏覽量
27354 -
字符串
+關(guān)注
關(guān)注
1文章
577瀏覽量
20485
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論