errno 介绍
Linux中系统调用的错误通过函数返回值来表示,并通过特殊变量 errno 来描述。错误都存储于 errno 中,errno 是一个全局变量(在 <errno.h> 头文件中定义),由操作系统维护,用于存储最近一次系统调用或库函数出错时的错误代码,即下一次的错误码会覆盖掉上一次的错误。
errno 是一个由POSIX和ISO C标准定义的符号,看起来就像是一个整形变量。当系统调用或者库函数发生错误的时候,它的值将会被改变。
使用 error 要注意三点:
- 如果系统调用或库函数执行正确的时候,
errno的值不会被置0。执行函数A的时候发生了错误,errno被改变,接下来执行函数B,如果函数B正确执行,errno还保留函数A发生错误时被设置的值。 - 系统调用或库函数正确执行,并不保证
errno的值不会被改变 - 任何错误号都是非0的
所以,当需要用 errno 来判断函数是否正确执行的时候,最好先将 errno 清0,函数执行结束时,通过其返回值判断函数是否正确执行,若没有正确执行,再根据 errno 判断哪里发生了错误。
如何使用 errno
当某些系统调用或标准库函数执行失败时,它们通常返回一个错误值(例如 -1 或 NULL ),并且会设置 errno 来指示具体的错误类型。例如:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *fp = fopen("non_existent_file.txt", "r");
if (fp == NULL) {
printf("打开文件失败,错误码: %d\\n", errno);
printf("错误信息: %s\\n", strerror(errno));
}
return 0;
}
打印错误信息函数
perror
#include <stdio.h>
void perror(const char *s);
它先打印 s 指向的字符串,然后输出当前 errno 值所对应的错误提示信息,例如当前 errno 若为12,调用 perror("ABC"),会输出 ABC: Cannot allocate memory 。
strerror
#include <string.h>
char *strerror(int errnum);
它返回 errnum 的值所对应的错误提示信息,例如 errnum 等于12的话,它就会返回 Cannot allocate memory 。






