POSIX AIO:将完成通知关联回原始请求的任何(好)方法?

时间:2011-12-09 22:54:02

标签: linux asynchronous io aio

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

1 个答案:

答案 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结构的详细信息。