日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 系统应用编程——出错处理(errno)

發(fā)布時(shí)間:2023/12/9 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 系统应用编程——出错处理(errno) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. errno變量
???? 文件 <errno.h> 中定義了符號(hào) errno 以及可以賦予它的各種常量,這些常量都是以字符 E 開頭。例如,若 errno 等于常量 EACCES,表示產(chǎn)生了權(quán)限問題(例如,沒有打開所要求文件的足夠權(quán)限)。

??????當(dāng) UNIX 函數(shù)出錯(cuò)時(shí),常常返回一個(gè)負(fù)值,而且將整型變量 errno 設(shè)置成含有附加信息的各個(gè)常量。例如,open 函數(shù)如果成功執(zhí)行則返回一個(gè)非負(fù)文件描述符,如出錯(cuò)則返回 -1。在 open 出錯(cuò)時(shí),有大約 15 種不同的errno 值(文件不存在、權(quán)限問題等)。

對(duì)于 errno 應(yīng)該知道兩條規(guī)則:

規(guī)則一:如果沒有出錯(cuò),則errno的值不會(huì)被一個(gè)例程清除。
因此,僅當(dāng)函數(shù)的返回值指明出錯(cuò)時(shí),才校驗(yàn) errno 的值。

規(guī)則二:任一函數(shù)都不會(huì)將errno的值設(shè)置為0,在<errno.h>中定義的所有常量都不為0。

?

出錯(cuò)標(biāo)志 errno 是一個(gè)整型數(shù)值,這個(gè)對(duì)于用戶提示不夠有好。C 標(biāo)準(zhǔn)定義了兩個(gè)函數(shù),用于幫助打印出錯(cuò)信息:

1)、strerror()

[cpp]?view plaincopy
  • #include?<string.h>??
  • #include?<errno.h>??
  • ??
  • char?*strerror(int?errnum);??
  • 返回值:指向消息字符串的指針

    此函數(shù)將 errnum(它通常就是 errno 值)映射為一個(gè)出錯(cuò)信息字符串,并且返回此字符串的指針。

    2)、perror()
    perror 函數(shù)基于 errno 的當(dāng)前值,在標(biāo)準(zhǔn)出錯(cuò)上產(chǎn)生一條出錯(cuò)信息,然后返回。

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • ??
  • void?perror(const?char?*msg);??
  • 它首先輸出由 msg 指向的字符串,然后是一個(gè)冒號(hào),一個(gè)空格,接著是對(duì)應(yīng)于 errno 值的出錯(cuò)信息,最后是一個(gè)換行符。

    例子:

    下面代碼展示了這兩個(gè)出錯(cuò)函數(shù)的使用方法::

    [cpp]?view plaincopy
  • #include?<string.h>??
  • #include?<stdio.h>??
  • #include?<errno.h>??
  • #include?<stdlib.h>??
  • int??
  • main(int?argc,?char?*argv[])??
  • {??
  • ????fprintf(stderr,?"EACCES:?%s\n",?strerror(EACCES));??
  • ????errno?=?ENOENT;??
  • ????perror(argv[0]);??
  • ????exit(0);??
  • }??
  • 執(zhí)行結(jié)果如下:

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/error$?./error???
  • EACCES:?Permission?denied??
  • ./error:?No?such?file?or?directory??
  • fs@ubuntu:~/qiang/error$???
  • ?
    2. 打印所有錯(cuò)誤信息

    C 標(biāo)準(zhǔn)庫定義了sys_nerr 用于記錄錯(cuò)誤信息總個(gè)數(shù),下面程序通過循環(huán)來打印所有信息。

    [cpp]?view plaincopy
  • #include?<string.h>??
  • #include?<stdio.h>??
  • #include?<errno.h>??
  • #include?<stdlib.h>??
  • int?main(int?argc,?char?*argv[])??
  • {??
  • ????int?idx?=?0;??
  • ????for?(idx?=?0;?idx?<?sys_nerr;?idx++)?{??
  • ????????printf("Error?#%3d:?%s\n",?idx,?strerror(idx));??
  • ????}??
  • ????exit(0);??
  • }??
  • 執(zhí)行結(jié)果如下:

    [cpp]?view plaincopy
  • fs@ubuntu:~/qiang/error$?./print_err???
  • Error?#??0:?Success??
  • Error?#??1:?Operation?not?permitted??
  • Error?#??2:?No?such?file?or?directory??
  • Error?#??3:?No?such?process??
  • Error?#??4:?Interrupted?system?call??
  • ??
  • ....??
  • ??
  • Error?#132:?Operation?not?possible?due?to?RF-kill??
  • Error?#133:?Unknown?error?133??
  • Error?#134:?Unknown?error?134??
  • fs@ubuntu:~/qiang/error$???

  • 3. 多線程擴(kuò)展
    在支持線程的環(huán)境中,多個(gè)線程共享進(jìn)程地址空間,每個(gè)線程都有屬于它自己的局部 errno 以避免一個(gè)線程干擾另一個(gè)線程。

    函數(shù) strerror() 不是線程安全的。因?yàn)樵摵瘮?shù)將 errnum 對(duì)應(yīng)的字符串保存在一個(gè)靜態(tài)的緩沖區(qū)中,然后將該緩沖區(qū)的指針返回。另一個(gè)線程調(diào)用 strerror() 就會(huì)重新設(shè)置靜態(tài)緩沖區(qū)的內(nèi)容。

    ?

    4. 出錯(cuò)恢復(fù)
    可將 <errno.h> 中定義的各種出錯(cuò)分成致命性的和非致命性的兩類。對(duì)于致命性的錯(cuò)誤,無法執(zhí)行恢復(fù)動(dòng)作,最多只能在用戶屏幕上打印出一條出錯(cuò)信息,或者將一條出錯(cuò)信息寫入日志文件,然后終止。而對(duì)于非致命性的錯(cuò)誤,有時(shí)可以較妥善地進(jìn)行處理。

    總結(jié)

    以上是生活随笔為你收集整理的Linux 系统应用编程——出错处理(errno)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。