zoukankan      html  css  js  c++  java
  • Linux下错误的捕获:全局变量errno和strerror()

    经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因。这个时候使用errno这个全局变量就相当有用了。
        在程序代码中包含 #include <errno.h>,然后每次程序调用失败的时候,系统会自动用用错误代码填充errno这个全局变量,这样你只需要读errno这个全局变量就可以获得失败原因了。
    例如:
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    int main(void)
    {
    int fd;
    extern int errno;

    if((fd = open("/dev/dsp",O_WRONLY)) < 0)
    {
    printf("errno=%d ",errno);
    }

    exit(0);
    }
    如果dsp设备忙的话errno值将是16。

    errno.h中定义的错误代码值如下:

    查看错误代码errno是调试程序的一个重要方法。当linux C的API函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。比较麻烦的是每次都要去linux源代码里面查找错误代码的含义,现在把它贴出来,以后需要查时就来这里看了。
    以下来自linux 2.4.20-18的内核代码中的/usr/include/asm/errno.h
    #ifndef _I386_ERRNO_H
    #define _I386_ERRNO_H
    #define EPERM 1
    #define ENOENT 2
    #define ESRCH 3
    #define EINTR 4
    #define EIO 5
    #define ENXIO 6
    #define E2BIG 7
    #define ENOEXEC 8
    #define EBADF 9
    #define ECHILD 10
    #define EAGAIN 11
    #define ENOMEM 12
    #define EACCES 13
    #define EFAULT 14
    #define ENOTBLK 15
    #define EBUSY 16
    #define EEXIST 17
    #define EXDEV 18
    #define ENODEV 19
    #define ENOTDIR 20
    #define EISDIR 21
    #define EINVAL 22
    #define ENFILE 23
    #define EMFILE 24
    #define ENOTTY 25
    #define ETXTBSY 26
    #define EFBIG 27
    #define ENOSPC 28
    #define ESPIPE 29
    #define EROFS 30
    #define EMLINK 31
    #define EPIPE 32
    #define EDOM 33
    #define ERANGE 34
    #define EDEADLK 35
    #define ENAMETOOLONG 36
    #define ENOLCK 37
    #define ENOSYS 38
    #define ENOTEMPTY 39
    #define ELOOP 40
    #define EWOULDBLOCK EAGAIN
    #define ENOMSG 42
    #define EIDRM 43
    #define ECHRNG 44
    #define EL2NSYNC 45
    #define EL3HLT 46
    #define EL3RST 47
    #define ELNRNG 48
    #define EUNATCH 49
    #define ENOCSI 50
    #define EL2HLT 51
    #define EBADE 52
    #define EBADR 53
    #define EXFULL 54
    #define ENOANO 55
    #define EBADRQC 56
    #define EBADSLT 57
    #define EDEADLOCK EDEADLK
    #define EBFONT 59
    #define ENOSTR 60
    #define ENODATA 61
    #define ETIME 62
    #define ENOSR 63
    #define ENONET 64
    #define ENOPKG 65
    #define EREMOTE 66
    #define ENOLINK 67
    #define EADV 68
    #define ESRMNT 69
    #define ECOMM 70
    #define EPROTO 71
    #define EMULTIHOP 72
    #define EDOTDOT 73
    #define EBADMSG 74
    #define EOVERFLOW 75
    #define ENOTUNIQ 76
    #define EBADFD 77
    #define EREMCHG 78
    #define ELIBACC 79
    #define ELIBBAD 80
    #define ELIBSCN 81
    #define ELIBMAX 82
    #define ELIBEXEC 83
    #define EILSEQ 84
    #define ERESTART 85
    #define ESTRPIPE 86
    #define EUSERS 87
    #define ENOTSOCK 88
    #define EDESTADDRREQ 89
    #define EMSGSIZE 90
    #define EPROTOTYPE 91
    #define ENOPROTOOPT 92
    #define EPROTONOSUPPORT 93
    #define ESOCKTNOSUPPORT 94
    #define EOPNOTSUPP 95
    #define EPFNOSUPPORT 96
    #define EAFNOSUPPORT 97
    #define EADDRINUSE 98
    #define EADDRNOTAVAIL 99
    #define ENETDOWN 100
    #define ENETUNREACH 101
    #define ENETRESET 102
    #define ECONNABORTED 103
    #define ECONNRESET 104
    #define ENOBUFS 105
    #define EISCONN 106
    #define ENOTCONN 107
    #define ESHUTDOWN 108
    #define ETOOMANYREFS 109
    #define ETIMEDOUT 110
    #define ECONNREFUSED 111
    #define EHOSTDOWN 112
    #define EHOSTUNREACH 113
    #define EALREADY 114
    #define EINPROGRESS 115
    #define ESTALE 116
    #define EUCLEAN 117
    #define ENOTNAM 118
    #define ENAVAIL 119
    #define EISNAM 120
    #define EREMOTEIO 121
    #define EDQUOT 122
    #define ENOMEDIUM 123
    #define EMEDIUMTYPE 124
    #endif

    同时也可以使用strerror()来自己翻译
    如:
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    int main(void)
    {
    int fd;
    extern int errno;

    if((fd = open("/dev/dsp",O_WRONLY)) < 0)
    {
    printf("errno=%d ",errno);
    char * mesg = strerror(errno);
    printf("Mesg:%s ",mesg);
    }

    exit(0);
    }
    dsp设备忙的话将输出如下:
    errno=16
    Mesg:Device or resource busy

  • 相关阅读:
    想算法无头绪,咋办?
    使用R语言分析股价波动
    cmd控制台 wrapper | OpenSCManager failed
    Ubuntu使用vi命令时,不能正常编辑文件,使用方向键时老是出现很多字母解决方案
    Ubuntu su命令 Authentication failure的解决办法
    Springboot2.x整合RabbitMQ
    RabbitMQ 笔记
    Ubuntu安装RabbitMQ
    使用xshell连接ubuntu
    Java 泛型
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/6225027.html
Copyright © 2011-2022 走看看