首页 > 解决方案 > 如何异步等待进程终止并找出退出代码?

问题描述

等待与pidfd_openand一起工作正常poll

我面临的问题,在进程退出后,显然poll()API 删除了有关现在已死进程的信息,因此waitidwithP_PIDFD参数立即失败,说代码 22“无效参数”</p>

我认为我负担不起为每个子进程启动一个线程以在阻塞上休眠waitpid,我有多个进程,以及另一个不是我需要有效轮询的进程的句柄。

任何解决方法?

如果重要的话,我只需要支持在 ARM64 和 ARMv7 CPU 上运行的 Linux 5.13.12 和更新版本。

内核调用的大致顺序如下:

  1. fork
  2. 在孩子:setresuid,,,setresgidexecvpe
  3. 在新的孩子:printf,,,sleep_exit
  4. 同时在父级中:pidfd_open, poll, 一旦完成waitidP_PIDFD一个参数。

预期结果:waitid应该给我孩子的退出代码。

实际结果:它什么都不做并设置errnoEINVAL

标签: clinuxasynchronousprocessembedded-linux

解决方案


有一点很关键。来自man waitid

应用程序应指定至少一个标志 WEXITED、WSTOPPED 或 WCONTINUED 与选项参数进行或运算。

我路过的是 WNOHANG

你想通过WNOHAND | WEXITED;)


推荐阅读