io_getevents(3)是否隐式处理EINTR?文档与实际行为为何有差异?
关于io_getevents(3)文档与实际行为差异的解析
- 首先得明确:
io_getevents(3)是用户态库libaio对内核系统调用io_getevents(2)的包装函数,它本质上会直接调用底层的系统调用接口,所以系统调用返回的EINTR错误会被包装层直接传递出来。 - 文档出现差异的核心原因是libaio的手册页维护滞后:
- 内核维护的
io_getevents(2)手册会第一时间同步系统调用的行为变更,准确性和时效性更高;而用户态libaio的文档更新往往跟不上代码实现的变化。 - 早期版本的libaio可能确实不会返回负错误码,但后来为了贴合底层系统调用的行为,代码实现做了调整,却没有同步更新手册内容,导致文档遗漏了
EINTR和负错误码的相关说明。
- 内核维护的
- 实际使用中返回负
EINTR的逻辑:当底层io_getevents(2)被信号中断返回正的EINTR错误码时,libaio的包装函数会将其转为负数形式返回(这是libaio库的错误码约定,用负数区分用户态库错误和系统调用错误),但这一行为完全没在手册里体现。
内容的提问来源于stack exchange,提问作者irsis
相关产品推荐
相关产品推荐

