在GNU中使用负的ERRNO值的历史

“负面错误”方法背后有历史吗? 也就是说,在许多内核代码和各种与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; 

在编写驱动程序,资源pipe理器,库等时,我已经成长为自己使用这种方法,但是我总是想知道实践的起源。 我个人觉得这是一个聪明的方法来处理与返回int函数的错误号,并想知道更多关于如何和开始。

谢谢。

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

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

http://yarchive.net/comp/linux/errno.html&#x4E0A; ,Linus Torvalds阐述了为什么错误变量方法有缺陷。

在现代的多线程POSIX实现上,errno被定义为一个宏来解决传统的extern int errno变量所具有的多线程问题。

正如他所说:

太糟糕了,用户空间必须修复内核所做的正确的错误代码,并将其转化为向后兼容的“errno”愚蠢。