父进程与子进程有竞争条件,相互通信的函数的实现及应用实例

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);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值