<errno.h> 是 C 语言标准库中的一个头文件,定义了与错误处理相关的宏和变量。它提供了 errno 变量和一些常用的错误代码,用于在程序执行过程中检测和报告错误。


📖 目录

  1. <errno.h> 简介
  2. errno 变量
  3. 常见错误码
  4. perror()strerror() 函数
  5. 示例代码
  6. 参考资料

1️⃣ <errno.h> 简介

  • 作用:提供用于获取程序错误状态的信息。
  • errno 变量:用于保存上一个系统调用或库函数错误的代码。当函数执行失败时,errno 会被设置为相应的错误代码。
  • 错误处理:通过检查 errno 的值,程序可以了解错误类型并进行相应处理。

⚠️ 重要说明

  • errno 不是由函数直接返回,而是一个全局变量,许多系统调用和标准库函数可能会在错误时修改它。每当调用这些函数时,errno 可能会发生变化,因此需要在调用出错函数之前检查其值。

2️⃣ errno 变量

  • errno 是一个全局变量,用于保存最后一个错误的错误代码。
  • 访问方法:通过 errno 获取错误码,通常在错误发生后立即检查它。
  • 线程安全性:在多线程程序中,errno 是线程局部存储(TLS)变量,意味着每个线程有自己的 errno 副本。

3️⃣ 常见错误码

<errno.h> 定义了一系列常用的错误码,它们是宏常量,代表了不同的错误类型。以下是一些常见的错误码:

错误码描述
EAGAIN资源暂时不可用,通常用于非阻塞I/O操作
ENOMEM内存不足
EINVAL无效的参数
EIO输入/输出错误
ENFILE系统文件表已满
EFAULT错误的地址
EPERM操作不被允许
EBADF错误的文件描述符
ENOSPC磁盘空间不足
EEXIST文件已经存在
ENOENT文件或目录不存在
EPIPE管道破裂(例如,写入关闭的管道)

4️⃣ perror()strerror() 函数

📌 perror() 函数

perror() 用于打印错误信息。它会打印一个带有用户自定义消息的字符串,后面跟着 errno 对应的错误信息。

语法

void perror(const char *s);

  • 参数
    • s:自定义的错误前缀消息。
  • 功能:打印自定义消息和错误代码对应的错误信息。

示例

#include <stdio.h>
#include <errno.h>

int main() {
    FILE *file = fopen("nonexistent_file.txt", "r");
    if (file == NULL) {
        perror("Error opening file");
    }
    return 0;
}

输出

Error opening file: No such file or directory

📌 strerror() 函数

strerror() 用于返回与 errno 相对应的错误描述字符串。

语法

char *strerror(int errnum);

  • 参数
    • errnum:错误代码。
  • 返回值:返回一个指向描述错误的字符串的指针。

示例

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    int err = ENOENT;  // 假设文件不存在
    printf("Error: %s\n", strerror(err));
    return 0;
}

输出

Error: No such file or directory


5️⃣ 示例代码

📌 示例:errnoperror() 使用

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent_file.txt", "r");
    
    if (file == NULL) {
        perror("File open error");  // 输出错误信息
        printf("Error code: %d\n", errno);  // 打印错误码
    }
    
    return 0;
}

输出

File open error: No such file or directory
Error code: 2

🔹 解释

  • perror() 输出错误消息,errno 被设置为 ENOENT,即文件或目录不存在。
  • 通过 perror(),可以快速获得错误描述。

📌 示例:strerror() 使用

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    int error_code = EACCES;  // 假设权限不足
    printf("Error: %s\n", strerror(error_code));
    return 0;
}

输出

Error: Permission denied

🔹 解释

  • strerror() 返回描述错误代码的字符串,EACCES 对应 “Permission denied”(权限被拒绝)。

6️⃣ 参考资料

📖 C 标准库官方文档 – errno.h
📖 GNU C Library – errno.h
📖 ISO C 标准(PDF)


📌 总结

<errno.h> 提供了错误处理机制,通过全局变量 errno 和错误码,帮助开发者获取系统调用或库函数的错误信息。常用的错误处理函数包括:

  • perror():输出自定义错误消息和 errno 对应的错误描述;
  • strerror():返回错误码对应的错误描述字符串。

🚀 这些功能在系统编程文件操作中尤为重要,能够帮助开发者快速定位问题并进行相应的错误处理。