On Wed, Jan 25, 2023 at 09:17:53PM +0100, Hiltjo Posthuma wrote:
> Using the new patch it does not handle zombie/defunct processes anymore on this
> machine. To reproduce it, in .xinitrc, on a dusty machine:
>
> sleep 10 &
> exec dwm
For ease of testing I wrote this dummy program. Both SIG_DFL and SIG_IGN
works on my system (glibc 2.36 & linux 5.15.13).
[/tmp]~> cat test.c
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(void)
{
const struct sigaction sc = {
.sa_handler = SIG_DFL,
.sa_flags = SA_RESTART | SA_NOCLDWAIT | SA_NOCLDSTOP,
};
if (sigaction(SIGCHLD, &sc, NULL) < 0)
abort();
while (waitpid(-1, NULL, WNOHANG) > 0);
puts("hello there");
(void)getchar();
}
[/tmp]~> cc -o test test.c
[/tmp]~> cat test.sh
#!/bin/sh
sleep 4 &
exec ./test
[/tmp]~> ./test.sh
And the `signal(3p)` version also works:
int main(void)
{
if (signal(SIGCHLD, SIG_IGN) < 0)
abort();
while (waitpid(-1, NULL, WNOHANG) > 0);
puts("hello there");
(void)getchar();
}
> Also, maybe it is better to not call sigprocmask? Since now it blocks all
> signals, including SIGTERM in setup().
_AT_Chris: I'm looking at the POSIX manpage for sigaction and I don't think
it can fail due to interrupt. Only `EINVAL` is specified:
https://www.man7.org/linux/man-pages/man3/sigaction.3p.html#ERRORS
So getting rid of the `sigprocmask` and manually testing for EINTR when
reaping inherited zombies should be fine, I think.
- NRK
Received on Thu Jan 26 2023 - 14:44:08 CET