and then:
Python 3.9.0b4
BPO 38692, os.pidfd_open added that allows process management without races and signals;
I'm still not get point of these 2 linux-specific system call.
First, we couldn't eliminate race condition by employ pidfd_open merely.
The manpage says:
Note, however, that this is guaranteed only if the following conditions hold true:
* the disposition of SIGCHLD has not been explicitly set to SIG_IGN (see sigaction(2));
* the SA_NOCLDWAIT flag was not specified while establishing a handler for SIGCHLD
or while setting the disposition of that signal to SIG_DFL (see sigaction(2)); and
* the zombie process was not reaped elsewhere in the program
(e.g., either by an asynchronously executed signal handler
or by wait(2) or similar in another thread).
If any of these conditions does not hold, then the child process
(along with a PID file descriptor that refers to it)
should instead be created using clone(2) with the CLONE_PIDFD flag.
There still a window between fork and pidfd_open. Only clone with CLONE_PIDFD could eliminate that completely.
And, of cause, we must use pidfd_send_signal instead of the plain old kill.
Second, by using something other than kill, it's feasible that we could eliminate race condition without those linux-specific features.
The key point is that: only direct parents can wait and make pid of children invalid and reusable. Only those direct parents can send signal to children without race conditions and MUST BE responsible for it. And the traditional way of writing daemon, making the daemon an orphan, is completely wrong. The solution is simple: sending requests to parents instead of using kill directly.
It is a little more complex than using pidfd. But if we want to write portable applications, we must write these extra code anyway, IN USERSPACE.
Or
Third, Linux are encouraging developer writing non-portable code and locking them in. Just like the old Windows. Isn't it?
asyncio are one component of Python's standard libraries. If pidfd fixs something in asyncio in Linux, how about BSDs? BSDs aren't even mentioned in the
issue tracker.