我是否认为 AIO 完成通知(无论是通过线程还是信号完成)没有提供关于哪个请求已完成的信息?除了为每个请求调用单独的回调函数之外,还有什么方法可以实现这种关联吗?表面上,您可以使用原始请求的 aiocb 结构来调用 aio_error 和 aio_return,但您不会将指针返回到 aiocb 结构作为通知回调的一部分。为什么似乎没有执行此操作的机制?
最佳答案
当您提交一个 struct aiocb
来启动异步 IO 时,您可以使用一个 struct sigevent
结构填充它的 aio_sigevent
成员:
struct sigevent {
int sigev_notify; /* Notification method */
int sigev_signo; /* Notification signal */
union sigval sigev_value; /* Data passed with
notification */
/* ... */
}
union sigval { /* Data passed with notification */
int sival_int; /* Integer value */
void *sival_ptr; /* Pointer value */
};
使用 aio_sigevent.sigev_value.sival_ptr
,您可以存储指向您的 struct aiocb
的指针(或将您的 struct aiocb
作为成员),然后您可以在调用信号处理程序时查找它:
si->si_value.sival_ptr;
aio(7)
manpage在研究这个时非常有帮助,sigevent(7)
联机帮助页有关于 struct sigevent
结构的详细信息。
关于linux - POSIX 一体机 : Any (good) way to correlate completion notifications back to original request?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452726/