aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/daemonize.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-11 21:06:55 +0000
committerrsc <devnull@localhost>2005-01-11 21:06:55 +0000
commite9dbe11dbf43197892680f3b5084cd12b6dc198b (patch)
tree356fbe1bc3c8a1516487bf5d9d8faab9556c620d /src/libthread/daemonize.c
parent2b85f70db0d42f72fc532de906494fa173efa834 (diff)
downloadplan9port-e9dbe11dbf43197892680f3b5084cd12b6dc198b.tar.gz
plan9port-e9dbe11dbf43197892680f3b5084cd12b6dc198b.tar.bz2
plan9port-e9dbe11dbf43197892680f3b5084cd12b6dc198b.zip
don't rfork(RFNOTEG) because then you lose
the ability to read from the console. damn. also, handle case where child exits before fork returns in parent. have to record that sigchld was seen and then run the handler later.
Diffstat (limited to 'src/libthread/daemonize.c')
-rw-r--r--src/libthread/daemonize.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c
index da8ec977..8f4d5eee 100644
--- a/src/libthread/daemonize.c
+++ b/src/libthread/daemonize.c
@@ -9,6 +9,7 @@
static int sigpid;
static int threadpassfd;
+static int gotsigchld;
static void
child(void)
@@ -44,12 +45,28 @@ child(void)
static void
sigpass(int sig)
{
+ if(sigpid == 1){
+ gotsigchld = 1;
+ return;
+ }
+
if(sig == SIGCHLD)
child();
else
kill(sigpid, sig);
}
+static int sigs[] =
+{
+ SIGHUP, SIGINT, SIGQUIT, SIGILL,
+ SIGTRAP, SIGABRT, SIGBUS, SIGFPE,
+ SIGUSR1, SIGSEGV, SIGUSR2, SIGPIPE,
+ SIGALRM, SIGTERM, SIGCHLD, SIGSTOP,
+ SIGTSTP, SIGTTIN, SIGTTOU, SIGURG,
+ SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF,
+ SIGWINCH, SIGIO, SIGPWR, SIGSYS
+};
+
void
_threadsetupdaemonize(void)
{
@@ -88,20 +105,23 @@ _threadsetupdaemonize(void)
for(i=0; i<100; i++) sched_yield();
notedisable("sys: child");
signal(SIGCHLD, SIG_DFL);
- rfork(RFNOTEG);
+ /* rfork(RFNOTEG); */
close(p[0]);
threadpassfd = p[1];
return;
}
sigpid = pid;
- for(i=0; i<NSIG; i++){
+ if(gotsigchld)
+ sigpass(SIGCHLD);
+
+ for(i=0; i<nelem(sigs); i++){
struct sigaction sa;
memset(&sa, 0, sizeof sa);
sa.sa_handler = sigpass;
sa.sa_flags |= SA_RESTART;
- sigaction(i, &sa, nil);
+ sigaction(sigs[i], &sa, nil);
}
for(;;){