首页 > 其他分享 >C语言系统错误信息

C语言系统错误信息

时间:2022-11-22 23:03:16浏览次数:63  
标签:调用 函数 错误信息 系统 错误码 C语言 函数调用 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)

      

C语言系统错误信息_strerror

       输出结果

      

C语言系统错误信息_strerror_02

      

C语言系统错误信息_系统错误_03

一共有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)

      

C语言系统错误信息_系统错误_04

       运行结果

      

C语言系统错误信息_系统错误_05

版权声明

作者:码农有道

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

 

 

标签:调用,函数,错误信息,系统,错误码,C语言,函数调用,errno,库函数
From: https://blog.51cto.com/u_13748800/5878710

相关文章

  • C语言目录文件操作补充
     本章节补充一些目录和文件操作的更多知识,因为这些知识涉及到时间操作,所以放在时间操作之后的章节中介绍。access库函数access函数用于判断当前操作系统用户对文件或目录的......
  • C语言常量和变量
     一切都是数据    对计算机来说,图片、文字、音乐、视频等都是数据,在计算机中以二进制的0和1存储,数据量越大,0和1就越多。    数据分为静态数据和动态数据。 ......
  • C语言程序的基本结构
    文章目录​​一、C语言基础知识的学习方法​​​​二、C语言程序开发的流程​​​​三、安装C语言的编译器​​​​四、C程序的基本结构​​​​1、程序的注释​​​​2、预......
  • C语言常量、变量和关键字
    文章目录​​一、一切都是数据​​​​1、静态数据​​​​2、动态数据(临时数据)​​​​二、常量​​​​三、变量​​​​1、整数型、字符型、浮点型变量​​​​2、字符串......
  • C语言运算符
    文章目录​​一、C语言的运算符​​​​二、算术运算符​​​​三、赋值运算符​​​​四、sizeof运算符​​​​五、运算符的优先级​​​​六、获取视频教程​​​​七、......
  • C语言输入和输出
    文章目录​​一、数据输入​​​​二、数据输出​​​​三、断章取义​​​​四、printf输出​​​​1、输出描述性的文字​​​​2、输出整数​​​​3、输出字符​​​​4......
  • C语言if分支结构
    文章目录​​一、关系运算符​​​​二、条件判断​​​​三、只使用if语句​​​​四、多个ifelse语句​​​​五、if语句的嵌套​​​​六、保持良好的编程习惯​​​​......
  • C语言循环
    文章目录​​一、程序结构​​​​二、while循环​​​​三、dowhile循环​​​​四、循环的跳转​​​​五、while循环的应用​​​​六、for循环​​​​七、for循环嵌套......
  • C语言switch分支结构
    文章目录​​一、ifelse的不足​​​​二、switch语句​​​​三、注意事项​​​​四、课后作业​​​​五、获取视频教程​​​​六、版权声明​​一、ifelse的不足C语......
  • C语言数组
    文章目录​​一、数组​​​​二、占用内存的大小​​​​三、数组的初始化​​​​四、注意事项​​​​五、在for循环中数组​​​​六、二维数组​​​​七、多维数组​......