Linux错误代码:errno.h与返回值 -EINVAL

1.概述

编写Linux驱动,看见返回值为 “return -EINVAL”,不是很清楚,特此查询。

图片[1]-Linux错误代码:errno.h与返回值 -EINVAL-趣考网

EINVAL 是定义在 errno.h 中的一个宏定义,它定义了一个整形变量(此处值为22),是错误代码的一个取值。EINVAL表示 无效的参数,即为 invalid argument ,包括参数值、类型或数目无效等。

2.错误代码的概念

错误(error)是指人们在使用软、硬件的时候,软、硬件不能正常操作的一种现象。由于错误的类型很多,为了对错误进行区分,系统设定了错误代码(error code),软、硬件在运行中如果发生错误,将通过它内部的原有的设定判断、识别而通过错误代码的显示方式给操作者,操作者通过错误代码识别,快速找到软、硬件不能正常操作的具体原因。

此处的错误代码即为在程序运行过程中,我们给不同类型的错误设定的一个唯一的编号,便于进行错误排除。

图片[2]-Linux错误代码:errno.h与返回值 -EINVAL-趣考网

3. 头文件

errno.h 是C语言C标准函式库里的标头档,定义了通过错误代码来回报错误资讯的宏。

errno.h 提供了一个整数全局变量errno,代码是一个int型的值,extern int errno来声明定义该错误值,errno 记录系统的最后一次错误代码。

当系统调用或者库函数的错误事件发生时可修改errno值,以记录错误的原因,该值可在任何需要的地方被修改;一般情况不为0的值表示出现了异常或者错误。errno.h中定义了一系列的错误代码,他们是以E开头的宏定义。

早期的C标准(C89和C99)规定, 中至少要定义 EDOM、ERANGE、EILSEQ 三个宏,它们用来表示具体的错误代码。在最新的 C11 标准中,将可移植的宏的个数扩展到了 78 个,其中包含了很多在 POSIX 环境中已经存在的名称。

程序可能发生的错误有成百上千种, 实际定义的宏也不止标准库里定义的内容,这些宏随不同的平台、不同的库实现而有所不同,依据这些宏编写的代码不具有跨平台性

在笔者使用的Ubuntun系统中,头文件位置如下:

图片[3]-Linux错误代码:errno.h与返回值 -EINVAL-趣考网

可以在error-bash.h中找到-EINVAL的定义如下:

图片[4]-Linux错误代码:errno.h与返回值 -EINVAL-趣考网

4.“-EINVAL”

在shell中执行man errno,可见errno的说明文档。

root@ubuntu:/# man errno

图片[5]-Linux错误代码:errno.h与返回值 -EINVAL-趣考网

在其中搜索 EINVAL ,结果如下:

图片[6]-Linux错误代码:errno.h与返回值 -EINVAL-趣考网

可见,EINVAL是POSIX.1规范中的一个宏,系统定义了一系列这样的错误代码,通过这样的宏可为 errno 这个全局变量设置不同的值,即可表示不同类型的系统错误。

那为什么又在EINVAL前加一个负号呢?

通常,UNIX系统中,对系统API调用时如果返回0表示函数成功执行,返回-1则表示函数执行失败;另一种错误返回方式就是通过返回不同的值来表征错误的类型或程序退出的状态,即可以通过返回不同的负值表征不同的错误的类型。

这些错误码都是定义的正值,即在正的错误码前加一个负号,在错误处理时当返回值小于0时,我们再进一步检测返回值的错误类型,因此就出现了“ return -EINVAL”

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享