1.先来函数的实现。
#include "apue.h"
static volatile sig_atomic_t sigflag;
static sigset_t newmask,emptymask,oldmask;
static void sig_user(int signo)
{
sigflag = 1;
}
void TELL_WAIT(void)
{
if (signal(SIGUSR1,sig_user) == SIG_ERR)
err_sys("signal(SIGUSR1) error");
if (signal(SIGUSR2,sig_user) == SIG_ERR)
err_sys("signal(SIGUSR2) error");
sigemptyset(&newmask);
sigemptyset(&emptymask);
sigaddset(&newmask,SIGUSR1);
sigadddset(&newmask,SIGUSR2);
if (sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)
err_sys("SIG_BLOCK error");
}
void TELL_PARENT(pid_t pid)
{
kill(pid,SIGUSR2);
}
void WAIT_PARENT(void)
{
while (sigflag == 0){
sigsuspend(&emptymask);
}
sigflag = 0;
if (sigprocmask(SIG_SETMASK,&oldmask;NULL) < 0)
err_sys("SIG_SETMASK error");
}
void TELL_CHILD(pid_t pid)
{
kill(pid,SIGUSR1);
}
void WAIT_CHILD(void)
{
while (sigflag == 0){
sigsuspend(&emptymask);
sigflag = 0;
if (sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0){
err_sys("SIG_SETMASK error");
}
}
2.函数的使用实例。
TELL_WAIT //开始时先TELL和WAIT的基础。
fork()
if pid == 0 //在子进程里
/*子进程处理自己的一些问题。
做完后TELL 父进程*/
TELL_PARENT
/*等待父进程的消息*/
WAIT_PARENT
exit(0);
else //父进程
/*做父进程自己的事情,做完后TELL 子进程,我们做完了*/
TELL_CHILD
WAIT_CHILD/*等待子进程的消息*/
eixt(0);