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