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
sigenable(int sig,int enabled)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
child(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
sigpass(int sig)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
_threadsetupdaemonize(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*
sleeper(void * v)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
main(int argc,char ** argv)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 }
97