首页 > 其他分享 >C语言获取系统错误

C语言获取系统错误

时间:2022-11-22 22:35:17浏览次数:42  
标签:调用 函数 错误 errno 程序 strerror C语言 获取 库函数


文章目录

  • ​​一、strerror函数​​
  • ​​二、errno的细节​​
  • ​​1、调用库函数失败不一定会设置errno​​
  • ​​2、errno不能作为调用库函数失败的标志​​
  • ​​3、程序员可以不用errno​​
  • ​​三、课后作业​​
  • ​​四、获取视频教程​​
  • ​​五、版权声明​​


我们在写程序的时候需要调用C语言提供的库函数,并通过函数的返回值判断调用是否成功。其实在C语言中,还有一个全局变量errno,存放了函数调用过程中产生的错误码。

为防止和正常的返回值混淆,库函数的调用一般并不直接返回错误码,而是将错误码(是一个整数值,不同的值代表不同的含义)存入一个名为errno 的全局变量中,errno 不同数值所代表的错误消息定义在 <errno.h>文件中。如果库函数调用失败,可以通过读出 errno的值来确定问题所在,推测程序出错的原因,这也是调试程序的一个重要方法。

配合 strerror和perror两个库函数,可以很方便地查看出错的详细信息。

strerror 在 <string.h> 中声明,用于获取错误码对应的消息描述。

perror 在 <stdio.h>中声明,用于在屏幕上最近一次系统错误码及其消息描述,在实际开发中,我们写的程序运行于后台,在屏幕上显示错误信息没有意义。

一、strerror函数

函数声明:

char *strerror(int errno);

函数说明:strerror()用来依参数errno的错误代码来查询其错误原因的描述字符串,然后将该字符串指针返回。

返回值:返回描述错误原因的字符串地址。

在gcc4.4.7版本中,定义了131个错误代码,我们用程序把它们全部显示出来。

示例(book158.c)

/*
* 程序名:book158.c,此程序演示strerror函数的使用。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
#include <string.h>

int main()
{
int errorno;

for(errorno=0;errorno<132;errorno++)
{
printf("%d:%s\n",errorno,strerror(errorno));
}
}

输出效果

C语言获取系统错误_c语言

一共有131个错误代码和描述,上面的截图只显示了前5条和最后5条。这些错误代码和描述看一下就行了,不需要记住。

二、errno的细节

1、调用库函数失败不一定会设置errno

如果库函数调用失败,库函数会设置errno的值,程序员通过 errno的值来判断出错的具体原因,但是,并不是全部的库函数在调用失败时都会设置errno的值,那么,哪些库函数会设置errno的值呢,要看函数的说明,例如fopen函数,在命令行下输入man fopen,在诸多的文字中,有以下行说明文字。

The fopen() function may also fail and set errno for any of the errors specified for the routine open(2).

不属于系统调用的函数不会设置errno,属于系统调用的函数才会设置errno。

2、errno不能作为调用库函数失败的标志

在 C 语言中,如果库函数被正确地执行,那么 errno 的值不会被清零。换句话说,errno的值只有在一个库函数调用发生错误时才会被设置,当库函数调用成功运行时,errno的值不会被修改,当然也不会主动被置为0。也正因为如此,在实际编程中,判断函数执行是否成功还得靠函数的返回值,只有在返回值是失败的情况下,才需要关注errno的值。

3、程序员可以不用errno

关注errno的目的是为了获取更详细错误信息,这些错误信息对程序员诊断程序可能会有帮助,但不是必须的。

示例(book160.c)

/*
* 程序名:book160.c,此程序用于演示C程序的基本结构。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
/*
* 此程序演示errno全局变量和strerror函数
* 作者:豫让 日期:20190601
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main()
{
FILE *fp=0; // 定义文件指针变量fp

// 以只读的方式打开文件/tmp/book1.c
if ( (fp=fopen("/tmp/book1.c","r")) == 0 )
{
printf("打开文件/tmp/book1.c失败(%d:%s)。\n",errno,strerror(errno));
}

// 关闭文件
if ( fp!=0 ) fclose(fp);

return 0;
}

运行效果

C语言获取系统错误_c++_02

三、课后作业

编写示例程序,把本章节介绍的知识点全部演示一遍,用程序演示可以加深您的理解和映象。

四、获取视频教程

五、版权声明

作者:码农有道

如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!


标签:调用,函数,错误,errno,程序,strerror,C语言,获取,库函数
From: https://blog.51cto.com/u_13748800/5878569

相关文章

  • C语言编译预处理
    文章目录​​一、预处理指令​​​​二、包含文件​​​​三、宏定义指令​​​​1、无参数的宏​​​​2、带参数的宏​​​​四、条件编译​​​​1、#ifdef​​​​2、#i......
  • C语言gdb调试
    文章目录​​一、gdb的安装​​​​二、调试前的准备​​​​三、基本调试命令​​​​四、课后作业​​​​五、获取视频教程​​​​六、版权声明​​程序员写在编写程序......
  • C语言makefile文件
    文章目录​​一、makefile的编写​​​​二、make命令​​​​三、makefile文件中的变量​​​​四、应用经验​​​​五、课后作业​​​​六、获取视频教程​​​​七、版......
  • C语言数据类型
    文章目录​​一、基本类型​​​​1、字符型(char)​​​​2、整型(int)​​​​3、浮点型(float)​​​​二、字符串​​​​三、构造类型​​​​四、指针类型​​​​五、其它......
  • C语言学习笔记---static关键字
    1、static修饰局部变量在函数体内,只初始化一次,被static声明过的局部变量在调用过程中值不变。原因:在任意函数内定义局部变量,存储在线程中的栈区,出函数时自动摧毁,所以在每......
  • c语言的钩子与C++的策略模式
    1.c语言钩子:特性模块:功能函数,调用注册函数主线模块:注册函数,定义钩子(通常是全局变量),调用钩子 2.c++策略模式:特性模块:从策略基类派生一个新特性类,实例化对象并调用se......
  • nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX
    问题:开发过程中碰到错误nestedexceptionisorg.apache.ibatis.binding.BindingException:Parameter‘XXX’notfound.解决思路:1.排查Dao层没有加@Param注解出现......
  • 这是注册博客的第一天,哈哈哈,我希望把我学到的编程内容记录下来,同时分享给和现在的我一
    #include<stdio.h>voidbubble_sort(intsz,intarr[])//不能只是intarr[],两个int间用逗号隔开{//先确定冒泡排序的趟数inti=0;for(i=0;i<sz-1;i++){intj=0;intflag=1......
  • mybatis - 获取参数值
    一、获取参数值1.只有一个参数情况<deleteid="deleteUserById">deletefromt_userwhereid=#{id}deletefromt_userwhereid='${id}'</delete>${}和#{}......
  • 【C语言进阶】六.预处理
     (1)程序的翻译环境和执行环境在ANSIC的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。包含编译加链接第2种是执行环境,......