【Linux系统】错误码 errno

errno 是一个全局变量,用于存储系统调用或库函数出错时的错误码。它在 C 标准库中广泛使用,特别是在处理文件操作、网络通信、信号处理等系统调用时。以下是关于 errno 的详细讲解:

errno 的基本概念

  • 定义

    • errno 是一个全局变量,通常定义在 <errno.h> 头文件中。
    • 它是一个整数,用于存储最近一次系统调用或库函数出错时的错误码。
  • 用途

    • 当一个系统调用或库函数失败时,它通常会返回一个特定的值(如 NULL-1),同时设置 errno 变量为一个特定的错误码。
    • 通过检查 errno 的值,可以确定具体的错误原因。

errno 的使用

1、检查错误

  • 在调用可能失败的系统调用或库函数后,检查返回值以确定是否发生错误。
  • 如果发生错误,检查 errno 的值以获取具体的错误码。

2、使用 strerror 函数

  • strerror 函数可以将错误码转换为人类可读的错误信息。

    c 复制代码
    char *strerror(int errnum);

错误码的经典应用:

OJ系统判题过程:系统编译器编译运行代码,若编译不通过则编译器报错,若运行时不能通过,系统就会根据错误码返回该程序的错误信息:如 TLE、段错误、野指针....

我们下面就人为主动创造一种错误,并演示如果通过 strerror 函数打印人类看得懂的信息:

示例代码

以下是一个示例,展示了如何使用 errnostrerror 函数来处理文件打开失败的情况:

全局变量 errno 对应错误码编号

strerror 负责将错误码信息打印出来

常见的错误码及其描述

以下是一些常见的错误码及其对应的描述:

  • EACCES (13):权限不足。
  • ENOENT (2):没有这样的文件或目录。
  • ENOMEM (12):内存不足。
  • EINTR (4):系统调用被信号中断。
  • EINVAL (22):无效的参数。
  • EIO (5):输入/输出错误。

查看系统所有错误码及其信息:穷举法

我的Linux系统,错误码最多到 133

注意事项

  1. 线程安全

    • errno 是一个全局变量,在多线程环境中可能会导致竞争条件。因此,在多线程程序中,建议使用线程安全的错误处理机制,如 pthread_getspecificpthread_setspecific
  2. 重置 errno

    • 在调用系统调用或库函数之前,有时需要将 errno 重置为 0,以确保之前的错误不会影响当前的错误检查。

      c 复制代码
      errno = 0;
  3. 检查 errno 的时机

    • 只有在系统调用或库函数返回失败时才检查 errno,因为 errno 只在失败时被设置。
相关推荐
存储服务专家StorageExpert18 分钟前
手搓一个 DELL EMC Unity存储系统健康检查清单
linux·运维·服务器·存储维护·emc存储
笑口常开xpr1 小时前
Linux 库开发入门:静态库与动态库的 2 种构建方式 + 5 个编译差异 + 3 个加载技巧,新手速看
linux·c语言·动态库·静态库
小虾米vivian1 小时前
达梦:将sql通过shell脚本的方式放在后台执行
服务器·数据库·sql
SonOfWind03111 小时前
CentOS搭建本地源
linux·运维·centos
IT成长日记1 小时前
【Nginx开荒攻略】Nginx主配置文件结构与核心模块详解:从0到1掌握nginx.conf:
linux·运维·nginx·配置文件
Nimsolax1 小时前
Linux线程控制
linux
代码的余温1 小时前
Web服务器VS应用服务器:核心差异解析
运维·服务器·前端
Light601 小时前
领码方案|Linux 下 PLT → PDF 转换服务超级完整版:异步、权限、进度(一气呵成)
linux·spring boot·pdf·gpcl6/ghostpcl·s3/oss·权限与审计·异步与进度
YuTaoShao2 小时前
【LeetCode 每日一题】36. 有效的数独
linux·算法·leetcode
NiKo_W2 小时前
Linux 开发工具(1)
linux·运维·服务器