commit e9dbe11dbf43197892680f3b5084cd12b6dc198b
parent 2b85f70db0d42f72fc532de906494fa173efa834
Author: rsc <devnull@localhost>
Date: Tue, 11 Jan 2005 21:06:55 +0000
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:
1 file changed, 23 insertions(+), 3 deletions(-)
diff --git 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(;;){