在編程中,我們一般都是要講究一定的使用規范的。按照一定的規范編寫代碼,返回運行提示,在代碼運行出現問題時能方便我們能快速的定位到問題的所在。
特別是在使用庫函數或者系統調用的API的時候,我們最好也要關注函數的返回值所能給我們提供的信息,充分利用好這些返回值以及返回值所代表的含義,對我們的錯誤查找是有很大的便利的!
本文記錄一下文件IO操作時的一些錯誤提示,通過函數的調用之后的返回值去查找對應的問題。
有關文件IO的 errno 變量
在linux系統中對于常見的錯誤都進行了統計,這些不同的錯誤已經被系統進行了編號,并且每個錯誤類型的編號都不一樣,以此來區分不同的錯誤類型。
errno實際上是一個int型的全局變量,它存儲的是當前執行函數所發生的錯誤編號,如果這個錯誤在被記錄時沒有被及時的訪問,那么會被下一次發生的錯誤編號所覆蓋掉。
但是有一點是要注意的,不是所有的庫函數或者系統調用都會有錯誤碼返回的,關于這邊要去查詢所調用的函數說明才能知道。比如我想知道函數 open 是否會返回錯誤碼,那就可以使用 man 2 open 進行查看,如下:
從圖中可以看出,open函數在調用出現異常的時候會設置errno變量的。
C庫函數 strerror( )
雖然我們知道了通過errno變量可以獲取到函數調用出現錯誤時的錯誤編號。但是錯誤編號它只是一個數字,對于我們而言光是知道一個數字總歸是差點意思的。
而我們最終是希望通過這個數字獲取到有關的錯誤原因或者某種提示,這才是我們查找問題的好幫手啊。
這個時候我們可以考慮使用一個C庫函數— strerror()。通過這個函數將我們代碼中獲取到的錯誤編碼轉換成對應的字符串輸出,讓我們能夠看的明白錯誤是怎么回事。
strerror()函數的原型如下:
#include
char*strerror(int errnum);
參數和返回值如下:
errnum :錯誤編號 errno。
返回值:對應錯誤編號的字符串描述信息。
比如:我調用open函數以只讀的方式打開一個不存在的文件,并打印變量errno的值,然后轉換成字符串輸出,看看是什么效果。
代碼如下:
#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);
}
運行之后的輸出結果如下:
從圖上可以看出來,因為xxxx.txt這個文件是不存在的,用open函數的只讀的方式打開的話,會返回錯誤編號2,通過strerror函數返回的錯誤信息是“No such file or directory”,說的是找不到這個文件。
當然,除了strerror函數之外,還有一個函數也是實現一樣的效果的,那就是perror,這個函數會自動附加一些信息輸出,可以更加方便我們輸出調試查看信息!
-
Linux系統
+關注
關注
4文章
594瀏覽量
27441 -
字符串
+關注
關注
1文章
584瀏覽量
20552
發布評論請先 登錄
相關推薦
評論