0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

有關(guān)文件IO操作的錯(cuò)誤(error)提示

冬至子 ? 來源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-05-20 16:31 ? 次閱讀

編程中,我們一般都是要講究一定的使用規(guī)范的。按照一定的規(guī)范編寫代碼,返回運(yùn)行提示,在代碼運(yùn)行出現(xiàn)問題時(shí)能方便我們能快速的定位到問題的所在。

特別是在使用庫函數(shù)或者系統(tǒng)調(diào)用的API的時(shí)候,我們最好也要關(guān)注函數(shù)的返回值所能給我們提供的信息,充分利用好這些返回值以及返回值所代表的含義,對我們的錯(cuò)誤查找是有很大的便利的!

本文記錄一下文件IO操作時(shí)的一些錯(cuò)誤提示,通過函數(shù)的調(diào)用之后的返回值去查找對應(yīng)的問題。

有關(guān)文件IO的 errno 變量

linux系統(tǒng)中對于常見的錯(cuò)誤都進(jìn)行了統(tǒng)計(jì),這些不同的錯(cuò)誤已經(jīng)被系統(tǒng)進(jìn)行了編號(hào),并且每個(gè)錯(cuò)誤類型的編號(hào)都不一樣,以此來區(qū)分不同的錯(cuò)誤類型。

errno實(shí)際上是一個(gè)int型的全局變量,它存儲(chǔ)的是當(dāng)前執(zhí)行函數(shù)所發(fā)生的錯(cuò)誤編號(hào),如果這個(gè)錯(cuò)誤在被記錄時(shí)沒有被及時(shí)的訪問,那么會(huì)被下一次發(fā)生的錯(cuò)誤編號(hào)所覆蓋掉。

但是有一點(diǎn)是要注意的,不是所有的庫函數(shù)或者系統(tǒng)調(diào)用都會(huì)有錯(cuò)誤碼返回的,關(guān)于這邊要去查詢所調(diào)用的函數(shù)說明才能知道。比如我想知道函數(shù) open 是否會(huì)返回錯(cuò)誤碼,那就可以使用 man 2 open 進(jìn)行查看,如下:

圖片

從圖中可以看出,open函數(shù)在調(diào)用出現(xiàn)異常的時(shí)候會(huì)設(shè)置errno變量的。

C庫函數(shù) strerror( )

雖然我們知道了通過errno變量可以獲取到函數(shù)調(diào)用出現(xiàn)錯(cuò)誤時(shí)的錯(cuò)誤編號(hào)。但是錯(cuò)誤編號(hào)它只是一個(gè)數(shù)字,對于我們而言光是知道一個(gè)數(shù)字總歸是差點(diǎn)意思的。

而我們最終是希望通過這個(gè)數(shù)字獲取到有關(guān)的錯(cuò)誤原因或者某種提示,這才是我們查找問題的好幫手啊。

這個(gè)時(shí)候我們可以考慮使用一個(gè)C庫函數(shù)— strerror()。通過這個(gè)函數(shù)將我們代碼中獲取到的錯(cuò)誤編碼轉(zhuǎn)換成對應(yīng)的字符串輸出,讓我們能夠看的明白錯(cuò)誤是怎么回事。

strerror()函數(shù)的原型如下:

#include 


char*strerror(int errnum);



參數(shù)和返回值如下:


errnum :錯(cuò)誤編號(hào) errno。


返回值:對應(yīng)錯(cuò)誤編號(hào)的字符串描述信息。

比如:我調(diào)用open函數(shù)以只讀的方式打開一個(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é)果如下:

圖片

從圖上可以看出來,因?yàn)閤xxx.txt這個(gè)文件是不存在的,用open函數(shù)的只讀的方式打開的話,會(huì)返回錯(cuò)誤編號(hào)2,通過strerror函數(shù)返回的錯(cuò)誤信息是“No such file or directory”,說的是找不到這個(gè)文件。

當(dāng)然,除了strerror函數(shù)之外,還有一個(gè)函數(shù)也是實(shí)現(xiàn)一樣的效果的,那就是perror,這個(gè)函數(shù)會(huì)自動(dòng)附加一些信息輸出,可以更加方便我們輸出調(diào)試查看信息!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    587

    瀏覽量

    27182
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    566

    瀏覽量

    20385
收藏 人收藏

    評論

    相關(guān)推薦

    文件IO操作時(shí)的常見錯(cuò)誤

    在編程中,我們一般都是要講究一定的使用規(guī)范的。按照一定的規(guī)范編寫代碼,返回運(yùn)行提示,在代碼運(yùn)行出現(xiàn)問題時(shí)能方便我們能快速的定位到問題的所在。
    發(fā)表于 01-11 15:36 ?1091次閱讀
    <b class='flag-5'>文件</b><b class='flag-5'>IO</b><b class='flag-5'>操作</b>時(shí)的常見<b class='flag-5'>錯(cuò)誤</b>

    makefile文件出現(xiàn)錯(cuò)誤提示 求解

    我在編譯簡單的驅(qū)動(dòng)程序框架時(shí)makefile文件出現(xiàn)cc1: error: invalid option `abi=apcs-gnu'錯(cuò)誤提示。大家看下怎么回事???makefile
    發(fā)表于 03-18 10:17

    用primace測試vhd文件提示錯(cuò)誤的解決辦法?

    Error:CMD_ERR_033: Cannot find current_design 'XZJ'! 用primace測試vhd文件提示如下錯(cuò)誤
    發(fā)表于 06-16 09:03

    硬盤故障提示

    硬盤故障提示 (1)Date error(數(shù)據(jù)錯(cuò)誤) 從軟盤或硬盤上讀取的數(shù)據(jù)存在不可修復(fù)錯(cuò)誤,磁盤上有壞扇區(qū)和壞的文件分配
    發(fā)表于 01-08 09:37 ?1539次閱讀

    電腦錯(cuò)誤信息的中文解讀

    電腦各種錯(cuò)誤信息的中文意思 一、BIOS中的提示信息 提示信息 說明 Drive A error 驅(qū)動(dòng)器A錯(cuò)誤 System halt 系統(tǒng)
    發(fā)表于 02-11 17:32 ?762次下載

    Bada系統(tǒng)學(xué)習(xí)-錯(cuò)誤碼(Error Codes)

    of an error code下表描述了錯(cuò)誤碼的詳情? Table: Error codes Error code
    發(fā)表于 04-02 14:35 ?482次閱讀

    STM32F1的ADC2如何使用DMA功能 USART過載錯(cuò)誤Overrun error

    STM32F1的ADC2如何使用DMA功能,USART過載錯(cuò)誤Overrun error
    的頭像 發(fā)表于 03-14 14:42 ?7774次閱讀
    STM32F1的ADC2如何使用DMA功能 USART過載<b class='flag-5'>錯(cuò)誤</b>Overrun <b class='flag-5'>error</b>

    【MCU】MDK錯(cuò)誤error in include chain (cmsis_armcc.h):expected identifier or ‘(‘

    【MCU】MDK錯(cuò)誤error in include chain (cmsis_armcc.h):expected identifier or ‘(‘
    發(fā)表于 11-30 19:51 ?17次下載
    【MCU】MDK<b class='flag-5'>錯(cuò)誤</b>:<b class='flag-5'>error</b> in include chain (cmsis_armcc.h):expected identifier or ‘(‘

    Keil編譯時(shí)提示“main.c(16): error C129: missing ';' before 'num'”

    Keil編譯時(shí)提示“main.c(16): error C129: missing ‘;’ before ‘num’”折騰了很久才知道是前面的“typedef unsigned char u8
    發(fā)表于 12-17 18:10 ?16次下載
    Keil編譯時(shí)<b class='flag-5'>提示</b>“main.c(16): <b class='flag-5'>error</b> C129: missing ';' before 'num'”

    error:expected identifier before ‘(‘ token,結(jié)構(gòu)體指針宏定義錯(cuò)誤

    error:expected identifier before ‘(’ token,結(jié)構(gòu)體指針宏定義錯(cuò)誤編譯時(shí)彈出標(biāo)題所示錯(cuò)誤,一般為宏定義里有與其他地方重復(fù)的常量符號(hào)。找出名字重復(fù)的符號(hào)并修改
    發(fā)表于 01-13 15:42 ?11次下載
    <b class='flag-5'>error</b>:expected identifier before ‘(‘ token,結(jié)構(gòu)體指針宏定義<b class='flag-5'>錯(cuò)誤</b>

    Linux下文件IO相關(guān)操作

    Linux - 基礎(chǔ) IO 文件 IO 相關(guān)操作 stdin stdout stderr 系統(tǒng)文件 I/O
    發(fā)表于 08-11 11:55 ?454次閱讀

    pip安裝時(shí) fatal error C1083 無法打開包括文件io.h” No such file or directory

    原文鏈接 報(bào)錯(cuò) 使用pip安裝模塊,出現(xiàn)錯(cuò)誤: c:\\users\\anaconda3\\include\\pyconfig.h(68): fatal error C1083: 無法打開包括文件
    的頭像 發(fā)表于 01-12 11:24 ?3149次閱讀

    嵌入式Linux學(xué)習(xí)筆記:文件IO

    在linux中一切都叫文件,比如普通文件,設(shè)備文件,管道。在應(yīng)用層,可以用一套文件IO讀寫文件,
    發(fā)表于 06-23 14:25 ?227次閱讀
    嵌入式Linux學(xué)習(xí)筆記:<b class='flag-5'>文件</b><b class='flag-5'>IO</b>

    a javascript error怎么修復(fù)

    修復(fù)"a javascript error"的方法可以因情況而異,但以下是一些常見的解決方法: 檢查錯(cuò)誤消息 首先,查看瀏覽器控制臺(tái)中的錯(cuò)誤消息。錯(cuò)誤消息通常會(huì)提供
    的頭像 發(fā)表于 11-26 14:41 ?4331次閱讀

    linux打開文本文件命令提示錯(cuò)誤

    Linux中打開文本文件的命令通常是使用文本編輯器打開,例如常用的命令有 vi 、 vim 、 nano 等。如果在使用其中一個(gè)命令時(shí)出現(xiàn)錯(cuò)誤提示,可能有以下幾種原因和解決方法。 錯(cuò)誤
    的頭像 發(fā)表于 12-22 15:10 ?618次閱讀