URI:
       tdon't rfork(RFNOTEG) because then you lose the ability to read from the console.  damn. - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit e9dbe11dbf43197892680f3b5084cd12b6dc198b
   DIR parent 2b85f70db0d42f72fc532de906494fa173efa834
  HTML Author: rsc <devnull@localhost>
       Date:   Tue, 11 Jan 2005 21:06:55 +0000
       
       don't rfork(RFNOTEG) because then you lose
       tthe 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:
         M src/libthread/daemonize.c           |      26 +++++++++++++++++++++++---
       
       1 file changed, 23 insertions(+), 3 deletions(-)
       ---
   DIR diff --git a/src/libthread/daemonize.c b/src/libthread/daemonize.c
       t@@ -9,6 +9,7 @@
        
        static int sigpid;
        static int threadpassfd;
       +static int gotsigchld;
        
        static void
        child(void)
       t@@ -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)
        {
       t@@ -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(;;){