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 }