Blob


1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <sys/wait.h>
5 #include <pthread.h>
7 #undef waitpid
8 #undef pipe
9 #undef wait
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 }
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 }
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 }
45 void
46 _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 void
89 main(int argc, char **argv)
90 {
91 pthread_t pid;
93 _threadsetupdaemonize();
94 pthread_create(&pid, 0, sleeper, 0);
95 exit(1);
96 }