sinit

suckless init
git clone git://git.2f30.org/sinit.git
Log | Files | Refs | README | LICENSE

commit fc4fd37ba81aa101b9790a875511456b4e57d66c
parent eae5382f6ac183086944ff964eeaa95fd7dbe936
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:
sinit.c | 15+++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)

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); }