linux系统编程 全局变量的异步IO

  1 #include<stdio.h>
  2 #include<signal.h>
  3 #include<unistd.h>
  4 #include<stdlib.h>
  5 
  6 int n = 0;
  7 int flag = 1;
  8 //SIGUSR1 SIGUSR2是系统定义给用户使用的信号
  9 void do_sig_child(int )//子进程捕捉函数
 10 {
 11         n+=2;
 12         printf("i am child PID=%d   num=%d\n",getpid(),n);
 13         flag=1;
 14 }
 15 void do_sig_parent(int )//父进程捕捉函数
 16 {
 17         n+=2;
 18         printf("i am parent PID=%d   num=%d\n",getpid(),n);
 19         flag=1;
 20 }
 21 void main(void)
 22 {
 23         //先创建一个子进程
 24         pid_t pid;
 25         //子进程注册捕捉函数do_sig_child
 26         signal(SIGUSR2,do_sig_child);
 27         //父进程注册捕捉函数do_sig_parent
 28         signal(SIGUSR1,do_sig_parent);
 29         pid=fork();
 30         if(pid>0){//两个进程各自打自己的
 31                 n=1;
 32                 //父进程打印第一个数
 33                 printf("i am parent PID=%d  num=%d\n",getpid(),n);
 34                 //父进程循环发送信号给子进程,让子进程捕捉函数do_sig_child执行
 35                 while(1){
 36                         if(flag==1){
 37                         kill(pid,SIGUSR2);
 38                         flag=0;
 39                         }
 40                 }
 41         }
 42         if(pid==0){//两个进程各自打自己的
 43                 n=2;
 44                 //子进程循环发送信号给父进程,让父进程捕捉函数do_sig_parent执行
 45                 while(1){
 46                         if(flag==1){
 47                         kill(getppid(),SIGUSR1);
 48                         flag=0;
 49                         }
 50                 }
 51         }
 52 }

该程序不能一直打印下去,会在某个位置停止不动

为什么?        fiag。在其中一个进程kill完信号的时候,被kernel调度,对方执行到flag=1时,内核返回使用权给该进程,该进程继续执行flag=0,此时while(1)中的flag条件不成立,所以停止不动。

解决办法:可以使用“锁机制”,或者尽量不使用全局变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值