我是否正确地认为AIO完成通知(无论是通过线程还是信号完成)都不会提供有关哪个请求已完成的信息?有没有办法完成这种关联,除了为每个请求调用单独的回调函数?表面上你可以使用原始请求的aiocb结构来调用aio_error和aio_return,但是你不会将指针作为通知回调的一部分返回到aiocb结构。为什么似乎没有这样做的机制?
答案 0 :(得分:2)
当您提交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
结构的详细信息。