#errno.h
这个头文件提供 报告错误情况 的相关功能,它定义了一个全局变量 errno
(错误编号)和一些标准的错误代码宏。
发生错误时可以通过读取 errno
获知错误,通过 string.h
中的 strerror
函数可以获得可读的错误说明。
同 stdio
中的 perror
函数可以便捷的打印错误说明。
示例:
#include <stdio.h>
#include <errno.h> // errno
#include <string.h> // strerror
int main() {
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 | 跨设备链接 |