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.
diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c index da8ec97..8f4d5ee 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 @@ 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 @@ 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(;;){