在GNU中使用负ERRNO值的历史

时间:2016-04-25 16:16:35

标签: c linux history

history behind the "negative error" approach吗?也就是说,在许多内核代码和各种与Linux相关的项目中,一个不设置errno,而是使用<errno.h>,返回代码的格式为:

int iErr;
if ( function_successful ) {
    iErr = 0;
} else if ( function_successful && num_bytes_handled > 0 ) {
    iErr = num_bytes_handled;
} else {
    // Error
    iErr = (-EINVAL);
}
return iErr;

我在编写驱动程序,资源管理器,库等时自己也开始使用这种方法,但我总是想知道实践的起源。我个人觉得这是一个聪明的方法,可以使用函数返回int来处理错误号,并希望了解更多关于它的起源和位置的信息。

谢谢。

2 个答案:

答案 0 :(得分:4)

历史上,系统调用返回正值(如果成功)或负值指示错误代码。就我而言,从一开始就是这种情况。如果出现错误,libc会将错误返回转换为errno的赋值和返回值-1,如果成功,则返回原始返回值。

这种方法是必需的,因为内核无法设置errno,因为它不知道errno的位置。有可能设计一个系统,其中内核被告知errno的位置,但这比让libc分配errno要复杂得多。

答案 1 :(得分:1)

http://yarchive.net/comp/linux/errno.html,Linus Torvalds详细阐述了为什么误差变量方法存在缺陷。

在现代多线程POSIX实现中,errno被定义为一个宏来解决传统extern int errno变量可能存在的多线程问题。

正如他所说:

  

用户空间必须修复正确的错误代码太糟糕了   返回内核,并将其转换为&#34; errno&#34;糊涂事   为了向后兼容。