在編程中,我們一般都是要講究一定的使用規(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文章
596瀏覽量
27510 -
字符串
+關(guān)注
關(guān)注
1文章
585瀏覽量
20604
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
文件IO操作時(shí)的常見(jiàn)錯(cuò)誤
![<b class='flag-5'>文件</b><b class='flag-5'>IO</b><b class='flag-5'>操作</b>時(shí)的常見(jiàn)<b class='flag-5'>錯(cuò)誤</b>](https://file.elecfans.com/web2/M00/8A/1F/poYBAGO-ZVGAQDSZAAGSEyMC2Ac058.png)
makefile文件出現(xiàn)錯(cuò)誤提示 求解
用primace測(cè)試vhd文件提示錯(cuò)誤的解決辦法?
硬盤(pán)故障提示
電腦錯(cuò)誤信息的中文解讀
Bada系統(tǒng)學(xué)習(xí)-錯(cuò)誤碼(Error Codes)
STM32F1的ADC2如何使用DMA功能 USART過(guò)載錯(cuò)誤Overrun error
![STM32F1的ADC2如何使用DMA功能 USART過(guò)載<b class='flag-5'>錯(cuò)誤</b>Overrun <b class='flag-5'>error</b>](https://file.elecfans.com/web1/M00/B7/73/o4YBAF5sfDCAYNUTAAG-M3nUlD4155.png)
【MCU】MDK錯(cuò)誤:error in include chain (cmsis_armcc.h):expected identifier or ‘(‘
![【MCU】MDK<b class='flag-5'>錯(cuò)誤</b>:<b class='flag-5'>error</b> in include chain (cmsis_armcc.h):expected identifier or ‘(‘](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Keil編譯時(shí)提示“main.c(16): error C129: missing ';' before 'num'”
![Keil編譯時(shí)<b class='flag-5'>提示</b>“main.c(16): <b class='flag-5'>error</b> C129: missing ';' before 'num'”](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
error:expected identifier before ‘(‘ token,結(jié)構(gòu)體指針宏定義錯(cuò)誤
![<b class='flag-5'>error</b>:expected identifier before ‘(‘ token,結(jié)構(gòu)體指針宏定義<b class='flag-5'>錯(cuò)誤</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux下文件IO相關(guān)操作
pip安裝時(shí) fatal error C1083 無(wú)法打開(kāi)包括文件 “io.h” No such file or directory
嵌入式Linux學(xué)習(xí)筆記:文件IO
![嵌入式Linux學(xué)習(xí)筆記:<b class='flag-5'>文件</b><b class='flag-5'>IO</b>](https://file1.elecfans.com/web2/M00/89/F3/wKgaomSNUUSAdtJgAABJOL8ktl8438.jpg)
評(píng)論