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>
7 f6127ed2 2005-01-04 devnull #undef waitpid
8 f6127ed2 2005-01-04 devnull #undef pipe
9 f6127ed2 2005-01-04 devnull #undef wait
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)
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);
21 f6127ed2 2005-01-04 devnull static void
22 f6127ed2 2005-01-04 devnull child(void)
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);
35 f6127ed2 2005-01-04 devnull static void
36 f6127ed2 2005-01-04 devnull sigpass(int sig)
38 f6127ed2 2005-01-04 devnull if(sig == SIGCHLD){
39 f6127ed2 2005-01-04 devnull print("sig\n");
42 f6127ed2 2005-01-04 devnull kill(sigpid, sig);
46 f6127ed2 2005-01-04 devnull _threadsetupdaemonize(void)
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];
52 f6127ed2 2005-01-04 devnull sigpid = 1;
54 f6127ed2 2005-01-04 devnull if(pipe(p) < 0)
57 f6127ed2 2005-01-04 devnull signal(SIGCHLD, sigpass);
58 f6127ed2 2005-01-04 devnull switch(pid = fork()){
62 f6127ed2 2005-01-04 devnull close(p[1]);
65 f6127ed2 2005-01-04 devnull close(p[0]);
69 f6127ed2 2005-01-04 devnull sigpid = pid;
71 f6127ed2 2005-01-04 devnull read(p[0], buf, sizeof buf-1);
72 f6127ed2 2005-01-04 devnull print("pipe\n");
77 f6127ed2 2005-01-04 devnull sleeper(void *v)
79 f6127ed2 2005-01-04 devnull pthread_mutex_t m;
80 f6127ed2 2005-01-04 devnull pthread_cond_t c;
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;
89 f6127ed2 2005-01-04 devnull main(int argc, char **argv)
91 f6127ed2 2005-01-04 devnull pthread_t pid;
93 f6127ed2 2005-01-04 devnull _threadsetupdaemonize();
94 f6127ed2 2005-01-04 devnull pthread_create(&pid, 0, sleeper, 0);