c - 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_notify
、sigev_signo
或sigev_notify_function
和sigev_value.sival_ptr
。)
为什么会这样?
解决方案
从aio_write手册:
写操作正在进行时,不得更改控制块。
在您的情况下,每次循环迭代结束后,变量就会超出范围。因此,就纯 C 和被调用的 API 而言,它都是未定义的行为。一种解决方案是创建 aiocb 的静态或动态数组。
推荐阅读
- api - 如何在 vuejs 中实现可重用的 api 调用组件?
- python - Python / Django NoReverseMatch
- azure - HTTP 基本身份验证和 Azure 函数
- amazon-ec2 - EC2 上的 OSM 切片服务器的推荐规范
- javascript - 如何将 Drift JavaScript 添加到 readthedocs 站点?
- css - 在项目中使用本地 Icon svg
- python - 如何从 jupyter notebook 中启动 jupyter notebook 终端?
- node.js - node-machine-id npm 库和实际唯一性
- typescript - React TypeScript 应用程序获取“TS2304:找不到名称“文本”。”
- html - 固定引导导航栏不工作