C 标准库 - `<errno.h>`

C 标准库 - <errno.h>

概述

<errno.h> 是 C 语言标准库中的一个头文件,它提供了错误码定义以及一些与错误处理相关的宏。这个头文件在所有遵循 ISO C 标准的系统中都是可用的,它对于程序员在编写需要错误处理功能的代码时非常有用。

错误码

<errno.h> 中定义了一系列的错误码,这些错误码在许多系统调用和库函数中用于报告错误。以下是一些常见的错误码:

  • EINTR:函数被信号中断。
  • EIO:I/O 错误。
  • ENOSYS:请求的系统调用不存在。
  • EACCES:没有权限访问。
  • EBADF:文件描述符无效。
  • EFAULT:指针指向无效的内存。
  • EINTR:函数被信号中断。
  • ENOTEMPTY:目录不为空。

这些错误码可以通过 errno 变量获取,该变量在发生错误时会被设置为相应的错误码。

errno 变量

errno 是一个全局变量,在 errno.h 头文件中定义。它用于存储最后一次系统调用或库函数调用的错误码。如果函数调用成功,errno 通常会被设置为 0

c 复制代码
#include <stdio.h>
#include <errno.h>

int main() {
    int fd = open("file.txt", O_RDONLY);
    if (fd == -1) {
        if (errno == EACCES) {
            printf("文件无法访问。\n");
        } else if (errno == ENOENT) {
            printf("文件不存在。\n");
        } else {
            printf("打开文件时发生错误。\n");
        }
    }
    return 0;
}

在上面的示例中,如果 open 函数调用失败,我们检查 errno 的值来确定具体的错误原因。

errno 清零

在某些情况下,你可能希望在函数调用后立即清零 errno,例如,当函数成功执行但不需要错误码时。这可以通过以下方式实现:

c 复制代码
#include <errno.h>

void my_function() {
    errno = 0; // 清零 errno
    // 函数体
}

errno 的线程安全性

在多线程环境中,errno 是线程不安全的。如果你在一个线程中设置了 errno,其他线程可能看到这个值,这可能导致错误的错误处理。因此,在多线程环境中,你应该避免直接修改 errno

错误处理函数

<errno.h> 还定义了一些用于错误处理的函数,例如:

  • perror():打印当前 errno 值的描述性文本。
  • strerror():返回 errno 值的描述性文本。
  • Euid_t:返回当前进程的有效用户ID。

以下是一些使用这些函数的示例:

c 复制代码
#include <stdio.h>
#include <errno.h>

int main() {
    perror("打开文件失败");
    printf("错误码:%d\n", errno);
    printf("错误描述:%s\n", strerror(errno));
    printf("当前进程的有效用户ID:%ld\n", (long)geteuid());
    return 0;
}

总结

<errno.h> 是 C 语言标准库中的一个重要头文件,它提供了错误码定义和错误处理相关的宏。通过正确地使用 errno 和相关函数,程序员可以编写健壮的错误处理代码。在编写需要错误处理的代码时,了解 <errno.h> 的用法是非常重要的。

相关推荐
2603_965148113 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
知无不研5 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_29146 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
C++ 老炮儿的技术栈7 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011167 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据7 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡8 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai8 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间8 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
小努蛋9 小时前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty