这个头文件提供 报告错误情况 的相关功能,它定义了一个全局变量 errno(错误编号)和一些标准的错误代码宏。
发生错误时可以通过读取 errno 获知错误;通过 string.h 中的 strerror 函数可以获得可读的错误说明。
使用 stdio 中的 perror 函数可以便捷的打印错误说明。
#include <stdio.h>
#include <errno.h> // errno
#include <string.h> // strerror
int main(void) {
FILE *fp = NULL;
// 尝试打开一个不存在的文件
fp = fopen("nonexistent_file.txt", "r");
if (fp == NULL) {
// 使用 errno 获取错误代码
printf("打开文件失败,错误代码: %d\n", errno);
// 检查特定错误类型
if (errno == ENOENT) {
printf("特定错误: 文件不存在(ENOENT)\n");
}
// 使用 strerror 获取错误说明
printf("错误说明: %s\n", strerror(errno));
// 使用 perror 便捷打印错误说明,和上一行代码基本等价
perror("错误说明");
// 返回失败
return 1;
}
// 文件操作...
// 关闭文件
fclose(fp);
printf("文件操作成功完成\n");
return 0;
}
运行结果:
打开文件失败,错误代码: 2
特定错误: 文件不存在(ENOENT)
错误说明: No such file or directory
错误说明: No such file or directory
| 宏 | 标准 | 说明 |
|---|---|---|
errno |
C89 | POSIX 兼容的线程局部错误号 |
注意:
错误码在不同环境中可能有不同的具体数值
并非所有系统都支持表中的全部错误码
不同环境可能定义有表中不包含的其它错误码
| 错误编号宏 | 标准 | 说明 |
|---|---|---|
EDOM |
C89 | 数学函数的参数超过定义域范围 |
EILSEQ |
C95 | 非法字节序列 |
ERANGE |
C89 | 数据超出范围 |
E2BIG |
POSIX | 参数列表太长 |
EACCES |
POSIX | 权限不足 |
EADDRINUSE |
POSIX | 地址已被使用 |
EADDRNOTAVAIL |
POSIX | 地址不可用 |
EAFNOSUPPORT |
POSIX | 地址族不支持 |
EAGAIN |
POSIX | 资源暂时不可用(通常等同于 EWOULDBLOCK) |
EALREADY |
POSIX | 连接已在进行中 |
EBADF |
POSIX | 错误的文件描述符 |
EBADMSG |
POSIX | 错误的消息 |
EBUSY |
POSIX | 设备或资源忙 |
ECANCELED |
POSIX | 操作已取消 |
ECHILD |
POSIX | 无子进程 |
ECONNABORTED |
POSIX | 连接中止 |
ECONNREFUSED |
POSIX | 连接被拒绝 |
ECONNRESET |
POSIX | 连接被重置 |
EDEADLK |
POSIX | 资源死锁 |
EDESTADDRREQ |
POSIX | 需要目标地址 |
EDQUOT |
POSIX | 磁盘配额超出 |
EEXIST |
POSIX | 文件已存在 |
EFAULT |
POSIX | 错误的地址 |
EFBIG |
POSIX | 文件太大 |
EHOSTUNREACH |
POSIX | 主机不可达 |
EIDRM |
POSIX | 标识符已移除 |
EINPROGRESS |
POSIX | 操作正在进行 |
EINTR |
POSIX | 系统调用被中断 |
EINVAL |
POSIX | 无效参数 |
EIO |
POSIX | 输入/输出错误 |
EISCONN |
POSIX | 套接字已连接 |
EISDIR |
POSIX | 是一个目录 |
ELOOP |
POSIX | 符号链接层数过多 |
EMFILE |
POSIX | 打开文件太多 |
EMLINK |
POSIX | 链接太多 |
EMSGSIZE |
POSIX | 消息太长 |
EMULTIHOP |
POSIX | 需要多跳 |
ENAMETOOLONG |
POSIX | 文件名太长 |
ENETDOWN |
POSIX | 网络已关闭 |
ENETRESET |
POSIX | 网络被重置 |
ENETUNREACH |
POSIX | 网络不可达 |
ENFILE |
POSIX | 系统打开文件太多 |
ENOBUFS |
POSIX | 无缓冲区空间 |
ENODATA |
POSIX | 无可用数据 |
ENODEV |
POSIX | 无此设备 |
ENOENT |
POSIX | 无此文件或目录 |
ENOEXEC |
POSIX | 执行格式错误 |
ENOLCK |
POSIX | 无可用锁 |
ENOLINK |
POSIX | 链接已断开 |
ENOMEM |
POSIX | 内存不足 |
ENOMSG |
POSIX | 无此消息 |
ENOPROTOOPT |
POSIX | 协议选项不可用 |
ENOSPC |
POSIX | 设备无剩余空间 |
ENOSR |
POSIX | 无流资源 |
ENOSTR |
POSIX | 不是流 |
ENOSYS |
POSIX | 功能未实现 |
ENOTCONN |
POSIX | 传输端点未连接 |
ENOTDIR |
POSIX | 不是目录 |
ENOTEMPTY |
POSIX | 目录非空 |
ENOTSOCK |
POSIX | 不是套接字 |
ENOTSUP |
POSIX | 不支持的操作 |
ENOTTY |
POSIX | 不适当的I/O控制操作 |
ENXIO |
POSIX | 无此设备或地址 |
EOPNOTSUPP |
POSIX | 操作不支持 |
EOVERFLOW |
POSIX | 值太大无法存储 |
EPERM |
POSIX | 操作不允许 |
EPIPE |
POSIX | 管道破裂 |
EPROTO |
POSIX | 协议错误 |
EPROTONOSUPPORT |
POSIX | 协议不支持 |
EPROTOTYPE |
POSIX | 协议类型错误 |
EROFS |
POSIX | 只读文件系统 |
ESPIPE |
POSIX | 非法寻址 |
ESRCH |
POSIX | 无此进程 |
ESTALE |
POSIX | 句柄失效 |
ETIME |
POSIX | 流式I/O超时 |
ETIMEDOUT |
POSIX | 连接超时 |
ETXTBSY |
POSIX | 文本文件忙 |
EWOULDBLOCK |
POSIX | 操作会阻塞(通常等同于 EAGAIN) |
EXDEV |
POSIX | 跨设备链接 |