POSIX 使用相同(错误)的信号值重复调用 AIO 回调

POSIX AIO callback called with the same (wrong) sigval repeatedly

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

我希望使用我提供的 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 只是构造一个 struct aiocb 并写入 aio 字段,以及 aio_sigevent 字段:sigev_notifysigev_signosigev_notify_function,和 sigev_value.sival_ptr。)

为什么会这样?

来自 aio_write 手册:

The control block must not be changed while the write operation is in progress.

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