URI:
       trdaemon.c - 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
       ---
       trdaemon.c (1382B)
       ---
            1 #include <stdlib.h>
            2 #include <stdio.h>
            3 #include <unistd.h>
            4 #include <sys/wait.h>
            5 #include <pthread.h>
            6 
            7 #undef waitpid
            8 #undef pipe
            9 #undef wait
           10 
           11 static int sigpid;
           12 static void
           13 sigenable(int sig, int enabled)
           14 {
           15         sigset_t mask;
           16         sigemptyset(&mask);
           17         sigaddset(&mask, sig);
           18         sigprocmask(enabled ? SIG_UNBLOCK : SIG_BLOCK, &mask, 0);
           19 }
           20 
           21 static void
           22 child(void)
           23 {
           24         int status, pid;
           25 printf("wait %d in %d\n", sigpid, getpid());
           26         pid = waitpid(sigpid, &status, __WALL);
           27         if(pid < 0)
           28                 perror("wait");
           29         else if(WIFEXITED(status))
           30                  _exit(WEXITSTATUS(status));
           31 printf("pid %d if %d %d\n", pid, WIFEXITED(status), WEXITSTATUS(status));
           32         _exit(97);
           33 }
           34 
           35 static void
           36 sigpass(int sig)
           37 {
           38         if(sig == SIGCHLD){
           39 print("sig\n");
           40                 child();
           41         }else
           42                 kill(sigpid, sig);
           43 }
           44 
           45 void
           46 _threadsetupdaemonize(void)
           47 {
           48         int i, n, pid;
           49         int p[2];
           50         char buf[20];
           51 
           52         sigpid = 1;
           53 
           54         if(pipe(p) < 0)
           55                 abort();
           56 
           57         signal(SIGCHLD, sigpass);
           58         switch(pid = fork()){
           59         case -1:
           60                 abort();
           61         default:
           62                 close(p[1]);
           63                 break;
           64         case 0:
           65                 close(p[0]);
           66                 return;
           67         }
           68 
           69         sigpid = pid;
           70 
           71         read(p[0], buf, sizeof buf-1);
           72 print("pipe\n");
           73         child();
           74 }
           75 
           76 void*
           77 sleeper(void *v)
           78 {
           79         pthread_mutex_t m;
           80         pthread_cond_t c;
           81 
           82         pthread_mutex_init(&m, 0);
           83         pthread_cond_init(&c, 0);
           84         pthread_cond_wait(&c, &m);
           85         return 0;
           86 }
           87 
           88 void
           89 main(int argc, char **argv)
           90 {
           91         pthread_t pid;
           92 
           93         _threadsetupdaemonize();
           94         pthread_create(&pid, 0, sleeper, 0);
           95         exit(1);
           96 }