如何知道'errno'意味着什么?

当调用execl(...)时,我得到一个errno=2。这是什么意思?我怎么知道这个errno的含义?

435322 次浏览

它的意思是:

未找到文件或目录。

这里是的文档。这应该会告诉你它的含义以及如何处理它们。您应该避免使用数值,并使用这里列出的常量,因为数字在不同的系统之间可能会发生变化。

调用

perror("execl");

以防出错。

示例:

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

errno(3)perror(3)的manpage也很有趣…

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

你不需要在你得到的任何错误代码上运行perror,你可以用下面的一行代码在你的系统上检索errno值的完整列表:

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

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

可以使用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()

有几个处理__abc0的有用函数。(为了弄清楚,这些是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输出你给它的消息,加上一个描述当前errno的字符串,导致标准错误。

我使用以下脚本:

#!/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

在Linux上也有一个非常简洁的工具,可以立即告诉每个错误代码的含义。在Ubuntu上:apt-get install errno

然后,如果你想获取错误类型2的描述,只需在终端中键入errno 2

使用errno -l,你会得到一个包含所有错误及其描述的列表。比之前的海报提到的其他方法简单多了。

#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 & lt; & lt;使用这一行来编译它

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

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

通常头文件有一个错误+接下来是注释中的解释;以下内容:

./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
}

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

perl -E 'say $!=shift' 2

收益率

No such file or directory

下面是为可读性重新格式化的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中使用tabularise来对齐列:

:%Tab /^[^ ]*\zs /r1l1l1
:%Tab /^ *[^ ]* *[^ ]*\zs /l1

在你的shell中输入sudo apt-get install moreutils,然后,一旦安装好,再输入errno 2。你也可以使用errno -l来处理所有的错误号,或者通过将其连接到grep来只查看文件中的错误号,就像这样:errno -l | grep file