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条件不成立,所以停止不动。
解决办法:可以使用“锁机制”,或者尽量不使用全局变量