commit e9dbe11dbf43197892680f3b5084cd12b6dc198b from: rsc date: Tue Jan 11 21:06:55 2005 UTC 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. commit - 2b85f70db0d42f72fc532de906494fa173efa834 commit + e9dbe11dbf43197892680f3b5084cd12b6dc198b blob - da8ec977bbd6f64da83052545f1d6b002d84862d blob + 8f4d5eee24a0e184579e4b8e415349b5ef98e6ff --- src/libthread/daemonize.c +++ 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