2

linux 中最新的 libaio API (/usr/include/libaio.h) 定义 io_event 如下:

struct io_event {
    PADDEDptr(void *data, __pad1);
    PADDEDptr(struct iocb *obj,  __pad2);
    PADDEDul(res,  __pad3);
    PADDEDul(res2, __pad4);
};

PADDEDul 解析为:

#define PADDEDul(x, y)  unsigned long x; unsigned y

我读过的所有例子都说如果'res'是负数,那么系统调用期间会发生错误并且res包含负的'errno'变量。我的问题是,如果 'res' 被声明为 unsigned long long ,它如何包含负 errno ?如果“res”不再包含错误代码,我在哪里可以得到它来进行写入或读取系统调用?

4

1 回答 1

0

请将 libaio 中的定义与 /usr/include/linux/aio_abi.h 中的定义进行比较。你会发现 'res' 和 'res2' 实际上在那里被定义为有符号整数。

为了您的方便,这里是 aio_abi.h 的链接:http: //kerneldox.com/kdox-linux/dd/db4/aio__abi_8h_source.html

此外,使用 glibc 中的 syscall() 包装内核 AIO API 也是一个可接受的选项。学习这些内核 API 将是一次令人印象深刻且有利可图的体验。首先,了解 nginx 如何使用它们。

快乐黑客!

于 2013-12-02T11:09:50.140 回答