【发布时间】:2021-09-23 15:47:51
【问题描述】:
pidfd_open 和 poll 的等待效果很好。
我面临的问题是,在进程退出后,poll() API 显然删除了有关现在已死进程的信息,因此带有P_PIDFD 参数的waitid 立即失败,代码22“无效参数”
我认为我无法为每个子进程启动一个线程以在阻塞 waitpid 上休眠,我有多个进程,还有另一个句柄不是我需要有效轮询的进程。
有什么解决方法吗?
如果重要的话,我只需要支持在 ARM64 和 ARMv7 CPU 上运行的 Linux 5.13.12 和更新版本。
内核调用的大致顺序如下:
fork- 在孩子:
setresuid,setresgid,execvpe - 在新的孩子:
printf,sleep,_exit - 同时在父级中:
pidfd_open、poll,一旦完成waitid和P_PIDFD第一个参数。
预期结果:waitid 应该给我孩子的退出代码。
实际结果:它什么都不做,将errno设置为EINVAL
【问题讨论】:
-
什么有效?什么不起作用?请发布minimal reproducible example。顺便说一句,您可以将 -1 传递给 waitpid,因此您只需要一个。
-
你能否创建一个线程安全变量(即布尔标志,例如`bool sf_running = true;)在适当的时候将其设置为false,并在你的监控线程中测试它?
-
@n.1.8e9-where's-my-sharem。
poll有效,当孩子退出时我会收到通知。waitid失败,所以我无法获取退出代码。 -
@ryyker 我在每个涉及的进程中只有一个线程。
-
waitpid 只有在你使用不正确的情况下才会失败。
标签: c linux asynchronous process embedded-linux