POSIX AIO:有什么(好的)方法可以将完成通知与原始请求关联起来?

发布于 2024-12-20 06:48:02 字数 188 浏览 2 评论 0原文

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

Am I right in thinking that AIO completion notifications (whether done via threads or signals) give you no information as to which request has completed? Is there any way to accomplish this correlation other than having separate callback functions called for each request? Ostensibly you can use the original request's aiocb structure to make calls to aio_error and aio_return, but you don't get a pointer back to the aiocb structure as part of the notification callback. Why does there seem to be no mechanism to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情感失落者 2024-12-27 06:48:02

当您提交struct aiocb来启动异步IO时,您可以使用struct sigevent结构填充其aio_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 */
   };

使用< code>aio_sigevent.sigev_value.sival_ptr 您可以存储指向您的struct aiocb(或具有您的struct aiocb 作为成员),然后您可以在调用信号处理程序时查找:

si->si_value.sival_ptr;

aio(7) 手册页 在研究这个问题时非常有帮助,sigevent(7) 手册页包含详细信息在 结构上sigevent 结构。

When you submit a struct aiocb to initiate the asynchronous IO, you're allowed to populate its aio_sigevent member with a struct sigevent structure:

   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 */
   };

Using aio_sigevent.sigev_value.sival_ptr you can store a pointer to your struct aiocb (or another structure that has your struct aiocb as a member) which you can then look up when your signal handler is called:

si->si_value.sival_ptr;

The aio(7) manpage was extremely helpful when researching this and the sigevent(7) manpage has details on the struct sigevent structure.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文