Ensure children are reaped periodically - sinit - suckless init
 (HTM) git clone git://git.suckless.org/sinit
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 170d599d58efee6c9be675a85c6e435d68e8a2de
 (DIR) parent 731f65fc82afcd474f4c682f9f0069e5c80c86dd
 (HTM) Author: sin <sin@2f30.org>
       Date:   Sun, 18 Mar 2018 13:35:38 +0000
       
       Ensure children are reaped periodically
       
       There is a pathological case where a parent receives SIGCHLD after its
       child dies but does not reap it.  After the parent dies, the child is
       reparented to init but SIGCHLD is not redelivered.
       
       To fix this, periodically check if there are zombies pending to be
       reaped.
       
       Diffstat:
         M sinit.c                             |       6 +++++-
       
       1 file changed, 5 insertions(+), 1 deletion(-)
       ---
 (DIR) diff --git a/sinit.c b/sinit.c
       @@ -7,7 +7,8 @@
        #include <stdlib.h>
        #include <unistd.h>
        
       -#define LEN(x) (sizeof (x) / sizeof *(x))
       +#define LEN(x)        (sizeof (x) / sizeof *(x))
       +#define TIMEO        30
        
        static void sigpoweroff(void);
        static void sigreap(void);
       @@ -20,6 +21,7 @@ static struct {
        } sigmap[] = {
                { SIGUSR1, sigpoweroff },
                { SIGCHLD, sigreap     },
       +        { SIGALRM, sigreap     },
                { SIGINT,  sigreboot   },
        };
        
       @@ -40,6 +42,7 @@ main(void)
                sigprocmask(SIG_BLOCK, &set, NULL);
                spawn(rcinitcmd);
                while (1) {
       +                alarm(TIMEO);
                        sigwait(&set, &sig);
                        for (i = 0; i < LEN(sigmap); i++) {
                                if (sigmap[i].sig == sig) {
       @@ -63,6 +66,7 @@ sigreap(void)
        {
                while (waitpid(-1, NULL, WNOHANG) > 0)
                        ;
       +        alarm(TIMEO);
        }
        
        static void