linux两个进程轮流数数,Linux进程间通信:父子进程通过信号通信,实现交替数数,时间间隔1秒...

/*===============================================================

* Copyright(C) 2020 Burgess Fan aLL rights reserved.

*

* 文件名称:ttt.c

* 创 建 者:Burgess

================================================================

*/

#include

#include

#include

#include

#include

#include

#include

int p_cnt=0;

int c_cnt=1;

void child_h(int num)

{

printf("sig=%d ,子进程报数:%d\n",num,c_cnt);

c_cnt+=2;

sleep(1);

}

void parent_h(int num)

{

printf("sig=%d ,父进程报数:%d\n",num,p_cnt);

p_cnt+=2;

sleep(1);

}

int main()

{

pid_t pid;

int ret;

sigset_t set,old;

sigemptyset(&set);

sigaddset(&set,SIGUSR1);//把SIGUSR1和SIGUSR2加入到阻塞信号集

sigaddset(&set,SIGUSR2);

sigprocmask(SIG_BLOCK,&set,&old);//阻塞信号

pid=fork();

if(pid<0)

{

perror("fork error!\n");

exit(-1);

}

else if(pid==0)//子进程

{

sleep(1);//子进程停留1秒,让父进程先报数

while(1)

{

child_h(SIGUSR1);//这里没有使用sigaction,在测试时,发现sigaction没有执行child_h,故只使用了sigprocmask来阻塞信号,然后直接用child_h()

sigprocmask(SIG_BLOCK,&old,NULL); //回到原状态

//printf("子进程\n");

int cnt=0;

ret=kill(getppid(),SIGUSR2);

if(ret<0)

perror("子进程error kill\n");

sleep(1);

}

}

else//父进程

{

while(1)

{

parent_h(SIGUSR2);

sigprocmask(SIG_BLOCK,&old,NULL);//回到原状态

ret=kill(pid,SIGUSR1);

// printf("父进程已经发送\n");

if(ret<0)

perror("父进程error kill\n");

sleep(1);

}

}

return 0;

}

运行结果如下:

20200424091459635025.jpg

原文:https://www.cnblogs.com/Burgess-Fan/p/12765172.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值