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
。