有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
来处理错误号,并希望了解更多关于它的起源和位置的信息。
谢谢。
答案 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;糊涂事 为了向后兼容。