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_notify
、sigev_signo
或sigev_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 的静态或动态数组。
我使用 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_notify
、sigev_signo
或sigev_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 的静态或动态数组。