代码之家  ›  专栏  ›  技术社区  ›  Barth Arun Karunagath

如何知道“errno”是什么意思?

  •  188
  • Barth Arun Karunagath  · 技术社区  · 16 年前

    打电话时 execl(...) 我得到了一个 errno=2 . 这是什么意思?我怎么知道这是什么意思 errno ?

    15 回复  |  直到 6 年前
        1
  •  297
  •   Commodore Jaeger    11 年前

    你可以使用 strerror() 获取错误号的可读字符串。这是由 perror() 但是,如果您要为标准错误输出之外的其他内容格式化错误消息,这将非常有用。

    例如:

    #include <errno.h>
    #include <string.h>
    
    /* ... */
    
    if(read(fd, buf, 1)==-1) {
        printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
    }
    

    Linux还支持显式线程安全变体 strerror_r() .

        2
  •  50
  •   Josh Kelley    16 年前

    而不是跑步 perror 在您得到的任何错误代码上,您可以检索 errno 系统上的值具有以下一行:

    cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3

        3
  •  41
  •   Pithikos    10 年前

    在Linux上,还有一个非常整洁的工具,可以立即分辨出每个错误代码的含义。在Ubuntu上: apt-get install errno .

    例如,如果您想获得错误类型2的描述,只需键入 errno 2 在终点站。

    errno -l 您将得到一个包含所有错误及其描述的列表。比以前海报提到的其他方法容易得多。

        4
  •  19
  •   schnaader    11 年前

    错误代码2表示“找不到文件/目录”。一般来说,您可以使用 perror 函数打印可读字符串。

        5
  •  18
  •   joeytwiddle    8 年前

    这是输出 errno -l 为可读性重新格式化:

      1   EPERM             Operation not permitted
      2   ENOENT            No such file or directory
      3   ESRCH             No such process
      4   EINTR             Interrupted system call
      5   EIO               Input/output error
      6   ENXIO             No such device or address
      7   E2BIG             Argument list too long
      8   ENOEXEC           Exec format error
      9   EBADF             Bad file descriptor
     10   ECHILD            No child processes
     11   EAGAIN            Resource temporarily unavailable
     11   EWOULDBLOCK       Resource temporarily unavailable
     12   ENOMEM            Cannot allocate memory
     13   EACCES            Permission denied
     14   EFAULT            Bad address
     15   ENOTBLK           Block device required
     16   EBUSY             Device or resource busy
     17   EEXIST            File exists
     18   EXDEV             Invalid cross-device link
     19   ENODEV            No such device
     20   ENOTDIR           Not a directory
     21   EISDIR            Is a directory
     22   EINVAL            Invalid argument
     23   ENFILE            Too many open files in system
     24   EMFILE            Too many open files
     25   ENOTTY            Inappropriate ioctl for device
     26   ETXTBSY           Text file busy
     27   EFBIG             File too large
     28   ENOSPC            No space left on device
     29   ESPIPE            Illegal seek
     30   EROFS             Read-only file system
     31   EMLINK            Too many links
     32   EPIPE             Broken pipe
     33   EDOM              Numerical argument out of domain
     34   ERANGE            Numerical result out of range
     35   EDEADLK           Resource deadlock avoided
     35   EDEADLOCK         Resource deadlock avoided
     36   ENAMETOOLONG      File name too long
     37   ENOLCK            No locks available
     38   ENOSYS            Function not implemented
     39   ENOTEMPTY         Directory not empty
     40   ELOOP             Too many levels of symbolic links
     42   ENOMSG            No message of desired type
     43   EIDRM             Identifier removed
     44   ECHRNG            Channel number out of range
     45   EL2NSYNC          Level 2 not synchronized
     46   EL3HLT            Level 3 halted
     47   EL3RST            Level 3 reset
     48   ELNRNG            Link number out of range
     49   EUNATCH           Protocol driver not attached
     50   ENOCSI            No CSI structure available
     51   EL2HLT            Level 2 halted
     52   EBADE             Invalid exchange
     53   EBADR             Invalid request descriptor
     54   EXFULL            Exchange full
     55   ENOANO            No anode
     56   EBADRQC           Invalid request code
     57   EBADSLT           Invalid slot
     59   EBFONT            Bad font file format
     60   ENOSTR            Device not a stream
     61   ENODATA           No data available
     62   ETIME             Timer expired
     63   ENOSR             Out of streams resources
     64   ENONET            Machine is not on the network
     65   ENOPKG            Package not installed
     66   EREMOTE           Object is remote
     67   ENOLINK           Link has been severed
     68   EADV              Advertise error
     69   ESRMNT            Srmount error
     70   ECOMM             Communication error on send
     71   EPROTO            Protocol error
     72   EMULTIHOP         Multihop attempted
     73   EDOTDOT           RFS specific error
     74   EBADMSG           Bad message
     75   EOVERFLOW         Value too large for defined data type
     76   ENOTUNIQ          Name not unique on network
     77   EBADFD            File descriptor in bad state
     78   EREMCHG           Remote address changed
     79   ELIBACC           Can not access a needed shared library
     80   ELIBBAD           Accessing a corrupted shared library
     81   ELIBSCN           .lib section in a.out corrupted
     82   ELIBMAX           Attempting to link in too many shared libraries
     83   ELIBEXEC          Cannot exec a shared library directly
     84   EILSEQ            Invalid or incomplete multibyte or wide character
     85   ERESTART          Interrupted system call should be restarted
     86   ESTRPIPE          Streams pipe error
     87   EUSERS            Too many users
     88   ENOTSOCK          Socket operation on non-socket
     89   EDESTADDRREQ      Destination address required
     90   EMSGSIZE          Message too long
     91   EPROTOTYPE        Protocol wrong type for socket
     92   ENOPROTOOPT       Protocol not available
     93   EPROTONOSUPPORT   Protocol not supported
     94   ESOCKTNOSUPPORT   Socket type not supported
     95   ENOTSUP           Operation not supported
     95   EOPNOTSUPP        Operation not supported
     96   EPFNOSUPPORT      Protocol family not supported
     97   EAFNOSUPPORT      Address family not supported by protocol
     98   EADDRINUSE        Address already in use
     99   EADDRNOTAVAIL     Cannot assign requested address
    100   ENETDOWN          Network is down
    101   ENETUNREACH       Network is unreachable
    102   ENETRESET         Network dropped connection on reset
    103   ECONNABORTED      Software caused connection abort
    104   ECONNRESET        Connection reset by peer
    105   ENOBUFS           No buffer space available
    106   EISCONN           Transport endpoint is already connected
    107   ENOTCONN          Transport endpoint is not connected
    108   ESHUTDOWN         Cannot send after transport endpoint shutdown
    109   ETOOMANYREFS      Too many references: cannot splice
    110   ETIMEDOUT         Connection timed out
    111   ECONNREFUSED      Connection refused
    112   EHOSTDOWN         Host is down
    113   EHOSTUNREACH      No route to host
    114   EALREADY          Operation already in progress
    115   EINPROGRESS       Operation now in progress
    116   ESTALE            Stale file handle
    117   EUCLEAN           Structure needs cleaning
    118   ENOTNAM           Not a XENIX named type file
    119   ENAVAIL           No XENIX semaphores available
    120   EISNAM            Is a named type file
    121   EREMOTEIO         Remote I/O error
    122   EDQUOT            Disk quota exceeded
    123   ENOMEDIUM         No medium found
    124   EMEDIUMTYPE       Wrong medium type
    125   ECANCELED         Operation canceled
    126   ENOKEY            Required key not available
    127   EKEYEXPIRED       Key has expired
    128   EKEYREVOKED       Key has been revoked
    129   EKEYREJECTED      Key was rejected by service
    130   EOWNERDEAD        Owner died
    131   ENOTRECOVERABLE   State not recoverable
    132   ERFKILL           Operation not possible due to RF-kill
    133   EHWPOISON         Memory page has hardware error
    

    我在vim中使用了tabulise来对齐列:

    :%Tab /^[^ ]*\zs /r1l1l1
    :%Tab /^ *[^ ]* *[^ ]*\zs /l1
    
        6
  •  7
  •   ephemient    16 年前

    有几个有用的函数可以用来处理 errno 为了说明清楚,这些是内置的 libc --我只是提供示例实现,因为有些人发现阅读代码比阅读英语更清晰。)

    #include <string.h>
    char *strerror(int errnum);
    
    /* you can think of it as being implemented like this: */
    static char strerror_buf[1024];
    const char *sys_errlist[] = {
        [EPERM]  = "Operation not permitted",
        [ENOENT] = "No such file or directory",
        [ESRCH]  = "No such process",
        [EINTR]  = "Interrupted system call",
        [EIO]    = "I/O error",
        [ENXIO]  = "No such device or address",
        [E2BIG]  = "Argument list too long",
        /* etc. */
    };
    int sys_nerr = sizeof(sys_errlist) / sizeof(char *);
    char *strerror(int errnum) {
        if (0 <= errnum && errnum < sys_nerr && sys_errlist[errnum])
            strcpy(strerror_buf, sys_errlist[errnum]);
        else
            sprintf(strerror_buf, "Unknown error %d", errnum);
        return strerror_buf;
    }
    

    strerror 返回描述传递给它的错误号的字符串。注意,这不是线程或中断安全的;可以自由重写字符串并在下次调用时返回相同的指针。使用 strerror_r 如果你需要担心的话。

    #include <stdio.h>
    void perror(const char *s);
    
    /* you can think of it as being implemented like this: */
    void perror(const char *s) {
        fprintf(stderr, "%s: %s\n", s, strerror(errno));
    }
    

    perror 打印出您提供的消息,再加上描述当前消息的字符串 埃尔诺 ,标准误差。

        7
  •  6
  •   LCC    9 年前

    这比在中查找代码快 errno.h ,比这里发布的大多数解决方案都短,不需要安装第三方工具:

    perl -E 'say $!=shift' 2

    产量

    No such file or directory

        8
  •  5
  •   Troy Alford    12 年前
    #include <errno.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    
    int main(int i, char *c[]) { 
      if (i != 2)  
        fprintf(stderr, "Usage: perror errno\n"); 
      else { 
        errno = atoi(c[1]); 
        perror(""); 
      } 
      exit(0); 
    }    
    

    适用于Solaris。
    cc perror.c -o perror <<使用此行编译它

        9
  •  5
  •   Peter Mortensen icecrime    10 年前

    这里是 the documentation . 这应该告诉你这意味着什么以及如何处理它们。您应该避免使用数值,并使用此处列出的常量,因为数字可能在不同系统之间发生变化。

        10
  •  3
  •   user25148    16 年前

    我使用以下脚本:

    #!/usr/bin/python
    
    import errno
    import os
    import sys
    
    toname = dict((str(getattr(errno, x)), x) 
                  for x in dir(errno) 
                  if x.startswith("E"))
    tocode = dict((x, getattr(errno, x)) 
                  for x in dir(errno) 
                  if x.startswith("E"))
    
    for arg in sys.argv[1:]:
        if arg in tocode:
            print arg, tocode[arg], os.strerror(tocode[arg])
        elif arg in toname:
            print toname[arg], arg, os.strerror(int(arg))
        else:
            print "Unknown:", arg
    
        11
  •  2
  •   Peter Mortensen icecrime    10 年前

    呼叫

    perror("execl");
    

    如果出现错误。

    Sample:

    if(read(fd, buf, 1)==-1) {
        perror("read");
    }
    

    书的主页 errno(3) perror(3) 也很有趣…

        12
  •  0
  •   Peter Mortensen icecrime    10 年前

    当你使用 strace (在Linux上)要运行二进制文件,它将输出来自系统调用的返回以及错误号的含义。这有时对你有用。

        13
  •  0
  •   Peter Mortensen icecrime    10 年前

    我在.bashrc文件中有以下函数-它从头文件中查找errno值(可以是 /usr/include/errno.h , /usr/include/linux/errno.h 等)

    如果机器上安装了头文件,它就可以工作;-)

    通常,头文件有一个错误+Next会在注释中给出解释;如下所示:

    /asm generic/errno base.h:define eagain 11/*重试*/

    function errno()
    {
        local arg=$1
    
        if [[ "x$arg" == "x-h" ]]; then
            cat <<EOF
            Usage: errno <num>
            Prints text that describes errno error number
            EOF
        else
            pushd /usr/include
            find . -name "errno*.h" | xargs grep   "[[:space:]]${arg}[[:space:]]"
            popd
        fi
    }
    
        14
  •  0
  •   Peter Mortensen icecrime    10 年前

    它的意思是:

    找不到文件或目录。

        15
  •  0
  •   Fenhl Atiar Talukdar    6 年前

    类型 sudo apt-get install moreutils 安装完成后,键入 errno 2 . 您也可以使用 errno -l 对于所有错误号,或通过管道将其发送到 grep ,像这样: errno | grep file .