97 lines
1.3 KiB
C
97 lines
1.3 KiB
C
#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);
|
|
}
|