errno、_doserrno、_sys_errlist 和 _sys_nerr
在程序执行过程中设置的保存错误代码的全局宏,以及用于显示的错误代码的等效字符串。
#define errno (*_errno()) #define _doserrno (*__doserrno()) #define _sys_errlist (__sys_errlist()) #define _sys_nerr (*__sys_nerr())
备注
程序启动期间,errno 和 _doserrno 均由运行时设置为 0。 errno 是在系统级调用中发生错误时设置的。 由于 errno 保留设置它的上一次调用的值,因此该值可能会被后续的调用更改。 发生错误时设置 errno 的运行库调用不会在成功后清除 errno。 始终在调用可能设置 errno 前,通过调用 _set_errno(0) 立即清除它,并在调用后立即进行检查。
发生错误时,errno 不必设置为与系统调用返回的错误代码相同的值。 对于 I/O 操作,_doserrno 将存储与 errno 代码等效的操作系统错误代码。 对于大多数非 I/O 操作,未设置 _doserrno 的值。
每个 errno 值都与可通过使用一个 perror 函数打印的 _sys_errlist 中的错误消息相关联,或者通过使用一个 strerror 或 strerror_s 函数存储在字符串中。 perror 和 strerror 函数使用 _sys_errlist 数组和 _sys_nerr(_sys_errlist 中的元素数量)处理错误信息。 出于代码安全原因,已弃用对 _sys_errlist 和 _sys_nerr 的直接访问。 我们建议你使用更安全的函数版本,而非全局宏,如下所示:
全局宏 |
等效函数 |
---|---|
_doserrno |
|
errno |
|
_sys_errlist, _sys_nerr |
库数学例程通过调用 _matherr 设置 errno。 若要以不同方式处理数学错误,请根据 _matherr 引用说明编写你自己的例程,并将其命名为 _matherr。
下表中的所有 errno 值是在 <errno.h> 中预定义的常量,并且与 UNIX 兼容。 ISO C99 标准中仅指定了 ERANGE、EILSEQ 和 EDOM。
常量 |
系统错误消息 |
值 |
---|---|---|
EPERM |
不允许执行该操作 |
1 |
ENOENT |
没有此文件或目录 |
2 |
ESRCH |
没有此进程 |
3 |
EINTR |
函数中断 |
4 |
EIO |
I/O 错误 |
5 |
ENXIO |
没有此设备或地址 |
6 |
E2BIG |
参数列表太长 |
7 |
ENOEXEC |
执行格式错误 |
8 |
EBADF |
文件编号错误 |
9 |
ECHILD |
没有生成的进程 |
10 |
EAGAIN |
没有更多进程、没有足够内存或达到最大嵌套级别 |
11 |
ENOMEM |
没有足够内存 |
12 |
EACCES |
权限被拒绝 |
13 |
EFAULT |
地址错误 |
14 |
EBUSY |
设备或资源忙碌 |
16 |
EEXIST |
文件已存在 |
17 |
EXDEV |
跨设备链接 |
18 |
ENODEV |
没有此设备 |
19 |
ENOTDIR |
不是目录 |
20 |
EISDIR |
是目录 |
21 |
EINVAL |
参数无效 |
22 |
ENFILE |
系统中打开的文件太多 |
23 |
EMFILE |
打开的文件太多 |
24 |
ENOTTY |
不适当的 I/O 控制操作 |
25 |
EFBIG |
文件太大 |
27 |
ENOSPC |
设备上没有剩余空间 |
28 |
ESPIPE |
搜寻无效 |
29 |
EROFS |
只读文件系统 |
30 |
EMLINK |
链接太多 |
31 |
EPIPE |
管道损坏 |
32 |
EDOM |
数学参数 |
33 |
ERANGE |
结果太大 |
34 |
EDEADLK |
会发生资源死锁 |
36 |
EDEADLOCK |
与 EDEADLK 相同,以便与早期的 Microsoft C 版本兼容 |
36 |
ENAMETOOLONG |
文件名太长 |
38 |
ENOLCK |
无可用锁 |
39 |
ENOSYS |
函数不受支持 |
40 |
ENOTEMPTY |
目录不为空 |
41 |
EILSEQ |
非法字节序列 |
42 |
STRUNCATE |
字符串被截断 |
80 |
要求
全局宏 |
必需的标头 |
可选标头 |
---|---|---|
errno |
<errno.h> 或 <stdlib.h>,<cerrno> 或 <cstdlib> (C++) |
|
_doserrno, _sys_errlist, _sys_nerr |
<stdlib.h>,<cstdlib> (C++) |
<errno.h>,<cerrno> (C++) |
_doserrno、_sys_errlist 和 _sys_nerr 宏是 Microsoft 扩展。 有关更多兼容性信息,请参见兼容性。
请参见
参考
strerror、_strerror、_wcserror、__wcserror