Use the double fork trick to properly reap spawned processes - sinit - suckless… | |
git clone git://git.suckless.org/sinit | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit fc4fd37ba81aa101b9790a875511456b4e57d66c | |
parent eae5382f6ac183086944ff964eeaa95fd7dbe936 | |
Author: sin <[email protected]> | |
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(-) | |
--- | |
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); | |
} |