Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.