errno变量以及相关函数的使用

系统错误处理介绍

在写应用程序时,我们总是要处理一些函数调用时返回的错误。分析错误原因用的最多的就是errno.如当linux系统函数遇到错误时,大多数函数会返回-1,并通过设置全局变量error指出错误的原因。下面就介绍一下它以及它相关的函数使用。

  1. volatile int errno全局变量
    1. 描述:最近一次调用函数出错时的错误码。用户也可以修改它。
    2. 有关错误代码的宏定义在errno.h文件中。文件中对每个错误码都有相关的描述。也可以使用函数strerror()来获取错误码代表的含义。本文列举了一些常见的错误描述,见文末。
  2. char *strerror(int errnum)
    1. 描述:返回描述errnum(错误号)含义的字符串指针。非线程安全。
    2. 需要包含string.h文件。
  3. int strerror_r(int errnum, char *buf, size_t buflen)
    1. 描述:功能等同于strerror()。不过它将字符串返回到了buff实体中,所以是线程安全的。
  4. void perror(const char *message)
    1. 打印一个错误信息到stderr.
    2. 需要包含stdio.h

下面的函数和变量使用时需要包含error.h文件。

  1. void error(int status, int errnum, const char *format, ...)
    1. 描述:此函数用于向stderr打印错误信息。信息包括程序名,errnum代表的错误号字符串,以及用户自定义的format格式字符串。
    2. status:表示调用此函数时是否结束进程(exit)。如果不为0则结束。
    3. errnum:错误号。校获类似strerror(errnum).打印信息时会打印错误号代表的字符串。
    4. format:效果类似于printf()函数的format.用于自定义字符串。
    5. 注意:如果设置了error_print_progname函数指针。在打印信息之前会先调用此回调函数。
  2. void error_at_line(int status, int errnum, const char *filename,unsigned int linenum, const char *format, ...)
    1. 描述:效果类似error(),不过添加了文件名和行信息的打印。一般使用__FILE____LINE__填充参数filenamelinenum
  3. unsigned int error_message_count全局变量
    1. 当调用error()error_at_line()时此变量会自增。
  4. int error_one_per_line全局变量
    1. 当此全局变量不为0时,error_at_line()同文件(filename)并且同行(linenum)的信息只会打印一次。如下面的程序。只会输出一个打印信息。
    error_one_per_line = 1;
    for(int i = 0; i < 10; i++){
        error_at_line(0,2,__FILE__,__LINE__,"%s","theboynaName");
    }
  5. void (*error_print_progname) (void)全局变量
    1. 函数指针。如果不为空。则error()error_at_line()在打印信息之前会先调用此回调函数。

使用例程如下:

#define _GNU_SOURCE //error_at_line()使用需要此宏

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <error.h>
 #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void testFun(void)
{
    fprintf(stderr,"123:456 ");
}

int main(int argc,char **argv)
{
    //全局变量error的使用
    int fd = open("noThisFile.txt",O_RDONLY,0);
    if(fd < 0){
        char *pstr = strerror(errno);
        perror(pstr);
    }

    //打印前10个错误号代表的含义
    for(int i = 0; i < 10; i++){
        char *pStr = strerror(i);
        printf("errno(%3d):%s\n",i,pStr);
    }

    //error_at_line函数的使用
    error_one_per_line = 1;
    error_print_progname = testFun;
    for(int i = 0; i < 10; i++){
        error_at_line(0,2,__FILE__,__LINE__,"%s","hahahhahaha");
    }
    return 0;
}

常见错误号表示的原因

errno(  0):Success
errno(  1):Operation not permitted
errno(  2):No such file or directory
errno(  3):No such process
errno(  4):Interrupted system call
errno(  5):Input/output error
errno(  6):No such device or address
errno(  7):Argument list too long
errno(  8):Exec format error
errno(  9):Bad file descriptor
errno( 10):No child processes
errno( 11):Resource temporarily unavailable
errno( 12):Cannot allocate memory
errno( 13):Permission denied
errno( 14):Bad address
errno( 15):Block device required
errno( 16):Device or resource busy
errno( 17):File exists
errno( 18):Invalid cross-device link
errno( 19):No such device
errno( 20):Not a directory
errno( 21):Is a directory
errno( 22):Invalid argument
errno( 23):Too many open files in system
errno( 24):Too many open files
errno( 25):Inappropriate ioctl for device
errno( 26):Text file busy
errno( 27):File too large
errno( 28):No space left on device
errno( 29):Illegal seek
errno( 30):Read-only file system
errno( 31):Too many links
errno( 32):Broken pipe
errno( 33):Numerical argument out of domain
errno( 34):Numerical result out of range
errno( 35):Resource deadlock avoided
errno( 36):File name too long
errno( 37):No locks available
errno( 38):Function not implemented
errno( 39):Directory not empty
errno( 40):Too many levels of symbolic links
errno( 41):Unknown error 41
errno( 42):No message of desired type
errno( 43):Identifier removed
errno( 44):Channel number out of range
errno( 45):Level 2 not synchronized
errno( 46):Level 3 halted
errno( 47):Level 3 reset
errno( 48):Link number out of range
errno( 49):Protocol driver not attached
errno( 50):No CSI structure available
errno( 51):Level 2 halted
errno( 52):Invalid exchange
errno( 53):Invalid request descriptor
errno( 54):Exchange full
errno( 55):No anode
errno( 56):Invalid request code
errno( 57):Invalid slot
errno( 58):Unknown error 58
errno( 59):Bad font file format
errno( 60):Device not a stream
errno( 61):No data available
errno( 62):Timer expired
errno( 63):Out of streams resources
errno( 64):Machine is not on the network
errno( 65):Package not installed
errno( 66):Object is remote
errno( 67):Link has been severed
errno( 68):Advertise error
errno( 69):Srmount error
errno( 70):Communication error on send
errno( 71):Protocol error
errno( 72):Multihop attempted
errno( 73):RFS specific error
errno( 74):Bad message
errno( 75):Value too large for defined data type
errno( 76):Name not unique on network
errno( 77):File descriptor in bad state
errno( 78):Remote address changed
errno( 79):Can not access a needed shared library
errno( 80):Accessing a corrupted shared library
errno( 81):.lib section in a.out corrupted
errno( 82):Attempting to link in too many shared libraries
errno( 83):Cannot exec a shared library directly
errno( 84):Invalid or incomplete multibyte or wide character
errno( 85):Interrupted system call should be restarted
errno( 86):Streams pipe error
errno( 87):Too many users
errno( 88):Socket operation on non-socket
errno( 89):Destination address required
errno( 90):Message too long
errno( 91):Protocol wrong type for socket
errno( 92):Protocol not available
errno( 93):Protocol not supported
errno( 94):Socket type not supported
errno( 95):Operation not supported
errno( 96):Protocol family not supported
errno( 97):Address family not supported by protocol
errno( 98):Address already in use
errno( 99):Cannot assign requested address
errno(100):Network is down
errno(101):Network is unreachable
errno(102):Network dropped connection on reset
errno(103):Software caused connection abort
errno(104):Connection reset by peer
errno(105):No buffer space available
errno(106):Transport endpoint is already connected
errno(107):Transport endpoint is not connected
errno(108):Cannot send after transport endpoint shutdown
errno(109):Too many references: cannot splice
errno(110):Connection timed out
errno(111):Connection refused
errno(112):Host is down
errno(113):No route to host
errno(114):Operation already in progress
errno(115):Operation now in progress
errno(116):Stale file handle
errno(117):Structure needs cleaning
errno(118):Not a XENIX named type file
errno(119):No XENIX semaphores available
errno(120):Is a named type file
errno(121):Remote I/O error
errno(122):Disk quota exceeded
errno(123):No medium found
errno(124):Wrong medium type
errno(125):Operation canceled
errno(126):Required key not available
errno(127):Key has expired
errno(128):Key has been revoked
errno(129):Key was rejected by service
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theboynoName

感谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值