国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > errno.h 以获得更好的体验。

# C 语言标准库头文件 errno.h

请查看 C 语言标准库头文件列表 了解更多相关 API。

这个头文件提供 报告错误情况 的相关功能,它定义了一个全局变量 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 兼容的线程局部错误号

# 错误编号

注意:

  1. 错误码在不同环境中可能有不同的具体数值

  2. 并非所有系统都支持表中的全部错误码

  3. 不同环境可能定义有表中不包含的其它错误码

错误编号宏 标准 说明
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 跨设备链接

# 推荐阅读

本文 更新于: 2025-11-27 09:38:06 创建于: 2025-11-27 09:38:06