| #include <stdlib.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <sys/wait.h> |
| #include <pthread.h> |
| |
| #undef waitpid |
| #undef pipe |
| #undef wait |
| |
| static int sigpid; |
| static void |
| sigenable(int sig, int enabled) |
| { |
| sigset_t mask; |
| sigemptyset(&mask); |
| sigaddset(&mask, sig); |
| sigprocmask(enabled ? SIG_UNBLOCK : SIG_BLOCK, &mask, 0); |
| } |
| |
| static void |
| child(void) |
| { |
| int status, pid; |
| printf("wait %d in %d\n", sigpid, getpid()); |
| pid = waitpid(sigpid, &status, __WALL); |
| if(pid < 0) |
| perror("wait"); |
| else if(WIFEXITED(status)) |
| _exit(WEXITSTATUS(status)); |
| printf("pid %d if %d %d\n", pid, WIFEXITED(status), WEXITSTATUS(status)); |
| _exit(97); |
| } |
| |
| static void |
| sigpass(int sig) |
| { |
| if(sig == SIGCHLD){ |
| print("sig\n"); |
| child(); |
| }else |
| kill(sigpid, sig); |
| } |
| |
| void |
| _threadsetupdaemonize(void) |
| { |
| int i, n, pid; |
| int p[2]; |
| char buf[20]; |
| |
| sigpid = 1; |
| |
| if(pipe(p) < 0) |
| abort(); |
| |
| signal(SIGCHLD, sigpass); |
| switch(pid = fork()){ |
| case -1: |
| abort(); |
| default: |
| close(p[1]); |
| break; |
| case 0: |
| close(p[0]); |
| return; |
| } |
| |
| sigpid = pid; |
| |
| read(p[0], buf, sizeof buf-1); |
| print("pipe\n"); |
| child(); |
| } |
| |
| void* |
| sleeper(void *v) |
| { |
| pthread_mutex_t m; |
| pthread_cond_t c; |
| |
| pthread_mutex_init(&m, 0); |
| pthread_cond_init(&c, 0); |
| pthread_cond_wait(&c, &m); |
| return 0; |
| } |
| |
| void |
| main(int argc, char **argv) |
| { |
| pthread_t pid; |
| |
| _threadsetupdaemonize(); |
| pthread_create(&pid, 0, sleeper, 0); |
| exit(1); |
| } |