Use the double fork trick to properly reap spawned processes - sinit - suckless init
 (HTM) git clone git://git.suckless.org/sinit
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit fc4fd37ba81aa101b9790a875511456b4e57d66c
 (DIR) parent eae5382f6ac183086944ff964eeaa95fd7dbe936
 (HTM) Author: sin <sin@2f30.org>
       Date:   Fri,  7 Feb 2014 11:14:38 +0000
       
       Use the double fork trick to properly reap spawned processes
       
       Diffstat:
         M sinit.c                             |      15 +++++++++++----
       
       1 file changed, 11 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/sinit.c b/sinit.c
       @@ -34,7 +34,7 @@ main(void)
                sigset_t set;
                pid_t pid;
                fd_set rfds;
       -        int c, fd, n;
       +        int status, fd, n;
        
                if (getpid() != 1)
                        return EXIT_FAILURE;
       @@ -48,7 +48,7 @@ main(void)
                        return EXIT_FAILURE;
                if (pid > 0)
                        for (;;)
       -                        wait(&c);
       +                        wait(&status);
        
                sigprocmask(SIG_UNBLOCK, &set, 0);
        
       @@ -102,17 +102,24 @@ dispatchcmd(int fd)
        static void
        spawn(const Arg *arg)
        {
       +        int status;
                pid_t pid;
                char *const *p = arg->v;
        
                pid = fork();
       -        if (pid < 0)
       +        if (pid < 0) {
                        weprintf("sinit: fork:");
       -        if (pid == 0) {
       +        } else if (pid == 0) {
       +                pid = fork();
       +                if (pid < 0)
       +                        weprintf("sinit: fork:");
       +                else if (pid > 0)
       +                        exit(0);
                        setsid();
                        setpgid(0, 0);
                        execvp(*p, p);
                        weprintf("sinit: execvp %s:", p);
                        _exit(errno == ENOENT ? 127 : 126);
                }
       +        waitpid(pid, &status, 0);
        }