Use sigaction(SA_NOCLDWAIT) for SIGCHLD handling
commit712d6639ff8e863560328131bbb92b248dc9cde7
authorChris Down <chris@chrisdown.name>
Sat, 28 Jan 2023 11:53:48 +0000 (28 12:53 +0100)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Sat, 28 Jan 2023 12:34:43 +0000 (28 13:34 +0100)
treec563872871c1e3e947d40caae45614498140e8dd
parent89f9905714c1c1b2e8b09986dfbeca15b68d8af8
Use sigaction(SA_NOCLDWAIT) for SIGCHLD handling

signal() semantics are pretty unclearly specified. For example, depending on OS
kernel and libc, the handler may be returned to SIG_DFL (hence the inner call
to read the signal handler). Moving to sigaction() means the behaviour is
consistently defined.

Using SA_NOCLDWAIT also allows us to avoid calling the non-reentrant function
die() in the handler.

Some addditional notes for archival purposes:

* NRK pointed out errno of waitpid could also theoretically get clobbered.
* The original patch was iterated on and modified by NRK and Hiltjo:
  * SIG_DFL was changed to SIG_IGN, this is required, atleast on older systems
    such as tested on Slackware 11.
  * signals are not blocked using sigprocmask, because in theory it would
    briefly for example also ignore a SIGTERM signal. It is OK if waitpid() is (in
    theory interrupted).

POSIX reference:
"Consequences of Process Termination":
https://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html#tag_16_01_03_01
dwm.c