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 中的错误消息相关联,或者通过使用一个 strerrorstrerror_s 函数存储在字符串中。 perrorstrerror 函数使用 _sys_errlist 数组和 _sys_nerr_sys_errlist 中的元素数量)处理错误信息。 出于代码安全原因,已弃用对 _sys_errlist_sys_nerr 的直接访问。 我们建议你使用更安全的函数版本,而非全局宏,如下所示:

全局宏 等效函数
_doserrno _get_doserrno_set_doserrno
errno _get_errno_set_errno
_sys_errlist, _sys_nerr strerror_s、_strerror_s、_wcserror_s、__wcserror_s

库数学例程通过调用 _matherr 设置 errno。 若要以不同方式处理数学错误,请根据 _matherr 引用说明编写你自己的例程,并将其命名为 _matherr

下表中的所有 errno 值是在 <errno.h> 中预定义的常量,并且与 UNIX 兼容。 ISO C99 标准中仅指定了 ERANGEEILSEQEDOM

常量 系统错误消息
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 扩展。 有关更多兼容性信息,请参阅 兼容性

另请参阅

全局变量
errno 常量
perror、_wperror
strerror、_strerror、_wcserror、__wcserror
strerror_s、_strerror_s、_wcserror_s、__wcserror_s
_get_doserrno
_set_doserrno
_get_errno
_set_errno