1. 接口以及实现
int TELL_WAIT(void);
int TELL_PARENT(pid_t parent);
int TELL_CHILD(pid_t child);
int WAIT_PARENT(pid_t parent);
int WAIT_CHILD(pid_t child);
#include <signal.h>
#include <sys/types.h>
int TELL_WAIT(void)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSR1);
sigaddset(&sigset,SIGUSR2);
/*多线程编程可以考虑:替换为pthread_sigmask*/
return sigprocmask(SIG_BLOCK,&sigset,NULL);
}
int TELL_PARENT(pid_t parent)
{
return kill(parent, SIGUSR1);
}
int TELL_CHILD(pid_t child)
{
return kill(child, SIGUSR2);
}
int WAIT_PARENT(pid_t parent)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSR2);
int signal;
return sigwait(&sigset,&signal);
}
int WAIT_CHILD(pid_t child)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSR1);
int signal;
return sigwait(&sigset,&signal);
}
2. 接口测试
2.1 等待父进程
输出: sucessfull!
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int TELL_WAIT(void)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSR1);
sigaddset(&sigset,SIGUSR2);
/*多线程编程可以考虑:替换为pthread_sigmask*/
return sigprocmask(SIG_BLOCK,&sigset,0);
}
int TELL_PARENT(pid_t parent)
{
return kill(parent, SIGUSR1);
}
int TELL_CHILD(pid_t child)
{
return kill(child, SIGUSR2);
}
int WAIT_PARENT(pid_t parent)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSR2);
int signal;
return sigwait(&sigset,&signal);
}
int WAIT_CHILD(pid_t child)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSR1);
int signal;
return sigwait(&sigset,&signal);
}
int main(void)
{
TELL_WAIT();
pid_t pid = fork();
if(-1 == pid)
{
printf("fork failed\n");
return -1;
}
if(0 == pid)
{
/*child*/
WAIT_PARENT(getppid());
printf("sucessfull!\n");
}
{
/*father*/
TELL_CHILD(pid);
}
}
2.2 等待子进程
输出: sucessfull!
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int TELL_WAIT(void)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSR1);
sigaddset(&sigset,SIGUSR2);
/*多线程编程可以考虑:替换为pthread_sigmask*/
return sigprocmask(SIG_BLOCK,&sigset,0);
}
int TELL_PARENT(pid_t parent)
{
return kill(parent, SIGUSR1);
}
int TELL_CHILD(pid_t child)
{
return kill(child, SIGUSR2);
}
int WAIT_PARENT(pid_t parent)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSR2);
int signal;
return sigwait(&sigset,&signal);
}
int WAIT_CHILD(pid_t child)
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset,SIGUSR1);
int signal;
return sigwait(&sigset,&signal);
}
int main(void)
{
TELL_WAIT();
pid_t pid = fork();
if(-1 == pid)
{
printf("fork failed\n");
return -1;
}
if(0 == pid)
{
/*child*/
TELL_PARENT(getppid());
}
{
/*father*/
WAIT_CHILD(pid);
printf("sucessfull!\n");
}
}