2

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

4

1 回答 1

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)手册页在研究这一点时非常有帮助,并且sigevent(7)手册页包含有关struct sigevent结构的详细信息。

于 2011-12-09T23:40:24.073 回答