Blame


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