diff options
author | Chris Down <chris@chrisdown.name> | 2023-01-28 12:53:48 +0100 |
---|---|---|
committer | Hiltjo Posthuma <hiltjo@codemadness.org> | 2023-01-28 13:34:43 +0100 |
commit | 712d6639ff8e863560328131bbb92b248dc9cde7 (patch) | |
tree | c563872871c1e3e947d40caae45614498140e8dd /transient.c | |
parent | 89f9905714c1c1b2e8b09986dfbeca15b68d8af8 (diff) |
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
Diffstat (limited to 'transient.c')
0 files changed, 0 insertions, 0 deletions