Blob
1 #include <stdlib.h>2 #include <stdio.h>3 #include <unistd.h>4 #include <sys/wait.h>5 #include <pthread.h>7 #undef waitpid8 #undef pipe9 #undef wait11 static int sigpid;12 static void13 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 }21 static void22 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 }35 static void36 sigpass(int sig)37 {38 if(sig == SIGCHLD){39 print("sig\n");40 child();41 }else42 kill(sigpid, sig);43 }45 void46 _threadsetupdaemonize(void)47 {48 int i, n, pid;49 int p[2];50 char buf[20];52 sigpid = 1;54 if(pipe(p) < 0)55 abort();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 }69 sigpid = pid;71 read(p[0], buf, sizeof buf-1);72 print("pipe\n");73 child();74 }76 void*77 sleeper(void *v)78 {79 pthread_mutex_t m;80 pthread_cond_t c;82 pthread_mutex_init(&m, 0);83 pthread_cond_init(&c, 0);84 pthread_cond_wait(&c, &m);85 return 0;86 }88 void89 main(int argc, char **argv)90 {91 pthread_t pid;93 _threadsetupdaemonize();94 pthread_create(&pid, 0, sleeper, 0);95 exit(1);96 }