On Wed, Jan 25, 2023 at 12:06:25PM +0600, NRK wrote: > On Tue, Jan 24, 2023 at 09:01:08PM +0100, Hiltjo Posthuma wrote: > > Although of course checking errno on a success condition is a bit wonky in > > this test case. > > It was just an illustration that the malloc succeeded :) > A more real-world check would be something like this (in fact, I'm quite > sure this is precisely the cause of the xlib XIO error): > > if (poll(...) < 0) { > if (errno == EINTR) > continue; > else > error(...); > } > > > What about a simplified version of a patch below, it should do a similar > > thing: > > > > /* clean up any zombies immediately */ > > - sigchld(0); > > + if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) > > + die("can't ignore SIGCHLD:"); > > One issue here is that this will not clean up any existing zombies > (inherited from .xinitrc etc). > > That's what that "clean up any zombies immediately" comment is referring > to. I think that comment ought to be a bit more descriptive and mention > where these zombies are coming from since it's not immediately obvious. > > One other thing worth mentioning is that this behavior wasn't well > defined on earlier POSIX versions so some historical BSDs may have > different behavior. From > (https://man7.org/linux/man-pages/man2/sigaction.2.html#NOTES): > > | POSIX.1-1990 disallowed setting the action for SIGCHLD to > | SIG_IGN. POSIX.1-2001 and later allow this possibility, so that > | ignoring SIGCHLD can be used to prevent the creation of zombies. > | Nevertheless, the historical BSD and System V behaviors for ignoring > | SIGCHLD differ > > The POSIX manpage for signal(3p) also says that "new applications should > use sigaction() rather than signal()" - probably due to these > incompatibility reasons. > > But in any case, if you don't want to use `sigaction`, I think reaping > the existing zombies after the `signal` call _should_ work: > > - /* clean up any zombies immediately */ > - sigchld(0); > + if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) > + die("can't ignore SIGCHLD:"); > + /* clean up any zombies (inherited from .xinitrc etc) > immediately */ > + while (waitpid(-1, NULL, WNOHANG) > 0); > > I haven't tested (or even compiled) the above patch. And it seems that > signals (much like threads) are really easy to mess up, so feel free to > correct if anything is wrong. > > - NRK >
I don't think there can be any zombies since it is run in setup() before any processes can spawn (via keybindings etc) or am I overlooking something obvious? -- Kind regards, Hiltjo