c - 如何异步等待进程终止并找出退出代码?
问题描述
等待与pidfd_open
and一起工作正常poll
。
我面临的问题,在进程退出后,显然poll()
API 删除了有关现在已死进程的信息,因此waitid
withP_PIDFD
参数立即失败,说代码 22“无效参数”</p>
我认为我负担不起为每个子进程启动一个线程以在阻塞上休眠waitpid
,我有多个进程,以及另一个不是我需要有效轮询的进程的句柄。
任何解决方法?
如果重要的话,我只需要支持在 ARM64 和 ARMv7 CPU 上运行的 Linux 5.13.12 和更新版本。
内核调用的大致顺序如下:
fork
- 在孩子:
setresuid
,,,setresgid
execvpe
- 在新的孩子:
printf
,,,sleep
_exit
- 同时在父级中:
pidfd_open
,poll
, 一旦完成waitid
第P_PIDFD
一个参数。
预期结果:waitid
应该给我孩子的退出代码。
实际结果:它什么都不做并设置errno
为EINVAL
解决方案
有一点很关键。来自man waitid
:
应用程序应指定至少一个标志 WEXITED、WSTOPPED 或 WCONTINUED 与选项参数进行或运算。
我路过的是 WNOHANG
你想通过WNOHAND | WEXITED
;)
推荐阅读
- r - 如何在 R 中使用 ggplot2 绘制两个变量的范围
- c# - NUnit - 单元测试 - 处理问题
- r - 根据条件创建匹配对
- bash - 在 find 中为 -exec 命令添加字符串
- node.js - 在节点 JS 上通过 HTTPS 进行 LiveReload 将不起作用
- amazon-web-services - *1 connect() 在连接上游时失败(111:连接被拒绝)-Elastic Beanstalk +Nginx +node/Express
- text-classification - 如何修复 max_length 和 max_features?
- reactjs - 如何根据用户输入在 Axios 中设置 Base URL - React Native
- mysql - 在sql中合并订单状态
- python - 使用 json.loads 解析 json 数组的正确方法是什么?