• erron变量、strerror函数 和 perror 函数



    一、erron变量

    在 Linux 系统下对常见的错误做了一个编号,每一个编号都代表着每一种不同的错误类型,当函数执行发生错误的时候,操作系统会将这个错误所对应的编号赋值给 errno 变量,每一个进程(程序)都维护了自己的 errno 变量,它是程序中的全局变量,该变量用于存储就近发生的函数执行错误编号,也就意味着下一次的错误码会覆盖上一次的错误码。

    errno 本质上是一个 int 类型的变量,用于存储错误编号,但是需要注意的是,并不是执行所有的系统调用或 C 库函数出错时,操作系统都会设置 errno,那如何确定一个函数出错时系统是否会设置 errno 呢?其实这个通过 man 手册便可以查到,譬如以 open 函数为例,执行"man 2 open"打开 open 函数的帮助信息,找到函数返回值描述段,如下所示:
    在这里插入图片描述
    从图中红框部分描述文字可知,当函数返回错误时会设置 errno,当然这里是以 open 函数为例,其它的系统调用同理查找,在我们的程序当中如何去获取系统所维护的这个errno变量呢?只需要在我们程序当中包含 头文件即可,你可以直接认为此变量就是在头文件中的申明的。

    以下代码可正常运行:

    #include 
    #include 
    int main(void)
    {
    	printf("%d\n", errno);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、strerror 函数

    strerror一个 C 库函数,该函数可以将对应的 errno 转换成适合我们查看的字符串信息,其函数原型如下所示(可通过"man 3 strerror"命令查看,注意此函数是 C 库函数,并不是系统调用):

    #include 
    char *strerror(int errnum);
    
    • 1
    • 2

    首先调用此函数需要包含头文件
    函数参数和返回值如下:
    errnum:错误编号 errno。
    返回值:对应错误编号的字符串描述信息。

    测试代码:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(void)
    {
    	int fd;
    	
    	/* 打开文件 */
    	fd = open("./test_file", O_RDONLY);
    	if (-1 == fd) 
    	{
    		printf("Error: %s\n", strerror(errno));
    		return -1;
    	}
    	
    	close(fd);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    编译源代码,在 Ubuntu 系统下运行测试下,在当前目录下并不存在 test_file 文件,测试打印结果如下:
    在这里插入图片描述
    从打印信息可以知道,strerror 返回的字符串是"No such file or directory",所以从打印信息可知,我们就可以很直观的知道 open 函数执行的错误原因是文件不存在!

    三、perror 函数

    除了 strerror 函数之外,我们还可以使用 perror 函数来查看错误信息,一般用的最多的还是这个函数,调用此函数不需要传入 errno,函数内部会自己去获取 errno 变量的值,调用此函数会直接将错误提示字符串打印出来,而不是返回字符串,除此之外还可以在输出的错误提示字符串之前加入自己的打印信息,函数原型如下所示(可通过"man 3 perror"命令查看):

    #include 
    void perror(const char *s);
    
    • 1
    • 2

    需要包含头文件。
    函数参数和返回值含义如下:
    s:在错误提示字符串信息之前,可加入自己的打印信息,也可不加,不加则传入空字符串即可。
    返回值:void 无返回值。

    测试代码

    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(void)
    {
    	int fd;
    	
    	/* 打开文件 */
    	fd = open("./test_file", O_RDONLY);
    	if (-1 == fd) 
    	{
    		perror("open error");
    		return -1;
    	}
    	
    	close(fd);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    编译源代码,在 Ubuntu 系统下运行测试下,在当前目录下并不存在 test_file 文件,测试打印结果如下:在这里插入图片描述
    从打印信息可以知道,perror 函数打印出来的错误提示字符串是"No such file or directory",跟 strerror 函数返回的字符串信息一样,"open error"便是我们附加的打印信息,而且从打印信息可知,perror 函数会在附加信息后面自动加入冒号和空格以区分。

  • 相关阅读:
    ssm校园失物招领系统毕业设计源码080008
    (附源码)ssm财务管理系统 毕业设计 282251
    小白都能看懂得Xxl-job安装教程
    学习Nano编辑器:入门指南、安装步骤、基本操作和高级功能
    Zabbix与乐维监控对比分析(二)——Agent管理、自动发现、权限管理
    透过生产车间看板洞悉生产制造企业的生产关键指标
    Java的HTTPClient工具类(附代码实现)
    【PAT甲级】1131 Subway Map
    论文阅读笔记 | 三维目标检测——PointPillars算法
    基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示应用
  • 原文地址:https://blog.csdn.net/Dustinthewine/article/details/126404288