errno
是一个全局变量,用于存储系统调用或库函数出错时的错误码。它在 C 标准库中广泛使用,特别是在处理文件操作、网络通信、信号处理等系统调用时。以下是关于 errno
的详细讲解:
errno
的基本概念
-
定义:
errno
是一个全局变量,通常定义在<errno.h>
头文件中。- 它是一个整数,用于存储最近一次系统调用或库函数出错时的错误码。
-
用途:
- 当一个系统调用或库函数失败时,它通常会返回一个特定的值(如
NULL
或-1
),同时设置errno
变量为一个特定的错误码。 - 通过检查
errno
的值,可以确定具体的错误原因。
- 当一个系统调用或库函数失败时,它通常会返回一个特定的值(如
errno
的使用
1、检查错误:
- 在调用可能失败的系统调用或库函数后,检查返回值以确定是否发生错误。
- 如果发生错误,检查
errno
的值以获取具体的错误码。
2、使用 strerror
函数:
-
strerror
函数可以将错误码转换为人类可读的错误信息。cchar *strerror(int errnum);
错误码的经典应用:
OJ系统判题过程:系统编译器编译运行代码,若编译不通过则编译器报错,若运行时不能通过,系统就会根据错误码返回该程序的错误信息:如 TLE、段错误、野指针....
我们下面就人为主动创造一种错误,并演示如果通过 strerror
函数打印人类看得懂的信息:
示例代码
以下是一个示例,展示了如何使用 errno
和 strerror
函数来处理文件打开失败的情况:
全局变量 errno
对应错误码编号
strerror
负责将错误码信息打印出来
常见的错误码及其描述
以下是一些常见的错误码及其对应的描述:
EACCES
(13):权限不足。ENOENT
(2):没有这样的文件或目录。ENOMEM
(12):内存不足。EINTR
(4):系统调用被信号中断。EINVAL
(22):无效的参数。EIO
(5):输入/输出错误。
查看系统所有错误码及其信息:穷举法
我的Linux系统,错误码最多到 133
注意事项
-
线程安全:
errno
是一个全局变量,在多线程环境中可能会导致竞争条件。因此,在多线程程序中,建议使用线程安全的错误处理机制,如pthread_getspecific
和pthread_setspecific
。
-
重置
errno
:-
在调用系统调用或库函数之前,有时需要将
errno
重置为 0,以确保之前的错误不会影响当前的错误检查。cerrno = 0;
-
-
检查
errno
的时机:- 只有在系统调用或库函数返回失败时才检查
errno
,因为errno
只在失败时被设置。
- 只有在系统调用或库函数返回失败时才检查