我是否认为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/

10-09 20:36