我是否认为AIO完成通知(无论是通过线程还是通过信号完成)对您没有任何信息说明哪个请求已经完成?除了为每个请求调用单独的回调函数之外,还有什么方法可以实现这种关联?从表面上看,您可以使用原始请求的aiocb结构来调用aio_error和aio_return,但是在通知回调中,您不会得到指向aiocb结构的指针。为什么似乎没有机制可以做到这一点?
最佳答案
提交struct aiocb
以启动异步IO时,可以使用aio_sigevent
结构填充其struct 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 AIO : Any (good) way to correlate completion notifications back to original request?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8452726/