首页 > 解决方案 > POSIX AIO 回调使用相同(错误)的 sigval 重复调用

问题描述

我使用 aio_write 发送了 100 个请求。我使用 . 将 sigval (回调参数)设置为某个地址request.aio_sigevent.sigev_value.sival_ptr = some_address;。每个请求都有不同的地址。回调应该向地址写入一些数据。

我希望使用我给它的 100 个不同参数调用回调 100 次。相反,回调被调用 100 次,每次都使用相同的参数:第 100 个请求的参数。我已经尝试过 SIGEV_THREAD 和 SIGEV_SIGNAL 两次都得到相同的结果。

我发送请求的代码片段:

for (int i = 0; i < num_requests; i++) {
    struct aiocb request = build_request(/* snip */, &array[i]);
    aio_write(&request);
}

(其中build_request简单地构造 astruct aiocb并写入 aio 字段以及aio_sigevent字段:sigev_notifysigev_signosigev_notify_functionsigev_value.sival_ptr。)

为什么会这样?

标签: cposixaio

解决方案


aio_write手册:

写操作正在进行时,不得更改控制块。

在您的情况下,每次循环迭代结束后,变量就会超出范围。因此,就纯 C 和被调用的 API 而言,它都是未定义的行为。一种解决方案是创建 aiocb 的静态或动态数组。


推荐阅读