linux - POSIX 一体机 : Any (good) way to correlate completion notifications back to original request?

标签 linux asynchronous io aio

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

最佳答案

当您提交一个 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 */
   };

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

si->si_value.sival_ptr;

aio(7) manpage在研究这个时非常有帮助,sigevent(7) 联机帮助页有关于 struct sigevent 结构的详细信息。

关于linux - POSIX 一体机 : Any (good) way to correlate completion notifications back to original request?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452726/

相关文章:

c - 如何使用C程序进入网络命名空间并读取文件内容

linux - 基于 linux 的嵌入式系统上的根用户

Linux 路由添加子域通配符 -host *.domain.com

c# - 异步方法中的奇怪调试器行为

c - 在输入行中间使用 EOF?

linux - 在 bash 或 zsh 中别名 anything=<C-a >"sudo "

Node.JS MongoDB 找到 : Sequential faster than parallel, 为什么?

Java 进程在启动外部进程后不会终止

java - 是否有与 StringWriter 等效但在 Java 内部具有 StringBuilder 的等效项?

java - 反序列化如何定位SerialVersionUid