在上一章节中,笔者给大家编写了许多的示例代码,大家会发现这些示例代码会有一个共同的特点,那就是当判定函数执行失败后,会调用 return 退出程序,但是对于我们来说,我们并不知道为什么会出错,什么缘故原由导致此函数执行失败,因为执行出错之后它们的返回值都是-1。
难道我们真的就不知道错误缘故原由了吗?实在不然,在 Linux 系统下对常见的错误做了一个编号,每一个编号都代表着每一种差别的错误类型,当函数执行发生错误的时间,操纵系统会将这个错误所对应的编号赋值给 errno 变量,每一个进程(程序)都维护了自己的 errno 变量,它是程序中的全局变量,该变量用于存储就近发生的函数执行错误编号,也就意味着下一次的错误码会覆盖上一次的错误码。以是由此可知道,当程序中调用函数发生错误的时间,操纵系统内部会通过设置程序的 errno 变量来告知调用者究竟发生了什么错误!
errno 本质上是一个 int 类型的变量,用于存储错误编号,但是必要留意的是,并不是执行所有的系统调用或 C 库函数出错时,操纵系统都会设置 errno,那我们如何确定一个函数出错时系统是否会设置 errno 呢?实在这个通过 man 手册便可以查到,譬如以 open 函数为例,执行"man 2 open"打开 open 函数的帮助信息,找到函数返回值描述段,如下所示:
当函数返回错误时会设置 errno,固然这里是以 open 函数为例,别的的系统调用也可以这样查找你可以直接以为此变量就是在<errno.h>头文件中的申明的,好,我们来测试下:
#include <stdio.h>
#include <errno.h>
int main(void)
{
printf("%d\n", errno);
return 0;
}
复制代码
以上的这段代码是不会报错的,大家可以自己试试! 1、strerror 函数
在 C 语言中, strerror 函数是一个标准库函数,用于根据错误代码返回一个描述性字符串,该字符串详细说明了错误的缘故原由。该函数是 <string.h> 头文件的一部分
在这个示例中,假如文件 nonexistent_file.txt 无法打开,fopen 会返回 NULL,而且 errno 会被设置为一个表现错误的代码。strerror(errno) 会返回一个与该错误代码相关的描述性字符串,比如 "No such file or directory"。 常见的错误代码与对应的描述
EINVAL:无效的参数。
ENOMEM:内存不敷。
EIO:输入/输出错误。
EBADF:坏的文件描述符。
EACCES:权限被拒绝。
ENOSPC:没有充足的空间。
2、perror 函数
在 C 语言中,perror 函数是一个用于打印错误信息的标准库函数,它将标准错误流 stderr 中输出一条错误消息。该消息是由一个给定的字符串和当前 errno 错误代码的描述组成的。
#include <stdio.h>
void perror(const char *s);
复制代码
s:这是一个字符串参数,它会被输出在错误信息前面,用来描述错误的上下文。s 后面会附带一个冒号和空格(假如 s 为空,错误信息只包含系统默认的错误消息)。
功能,perror 会使用全局变量 errno 来天生错误信息。errno 是由操纵系统或 C 库的系统调用或库函数设置的,它代表了近来一次的错误代码。perror 会将 errno 对应的错误描述与 s 字符串一起打印到标准错误流(stderr)。
具体来说,它会输出如下格式的消息: