The waiting works fine with pidfd_open
and poll
.
The problem I’m facing, after the process quits, apparently the poll()
API removes the information about the now dead process, so the waitid
with P_PIDFD
argument fails at once saying code 22 “Invalid argument”
I don’t think I can afford launching a thread for every child process to sleep on the blocking waitpid
, I have multiple processes, and another handles which aren’t processes I need to poll efficiently.
Any workarounds?
If it matters, I only need to support Linux 5.13.12 and newer running on ARM64 and ARMv7 CPUs.
The approximate sequence of kernel calls is following:
fork
setresuid
, setresgid
, execvpe
printf
, sleep
, _exit
pidfd_open
, poll
, once completed waitid
with P_PIDFD
first argument.Expected result: waitid
should give me the exit code of the child.
Actual result: it does nothing and sets errno
to EINVAL
There is one crucial bit. From man waitid
:
Applications shall specify at least one of the flags WEXITED, WSTOPPED, or WCONTINUED to be OR'ed in with the options argument.
I was passing was WNOHANG
And you want to pass WNOHAND | WEXITED
;)