代码:
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
//本程序:让父子进程交替打印数字,也是icp通信的一种
int n=0,flag=0;
void sys_err(char * str){
perror(str);
exit(1);
}
//子进程信号处理函数
void do_sig_child(int num){
printf("I am child %d\t%d\n", getpid(), n);
n += 2;
flag = 1;
//sleep(1);
}
//父进程信号处理函数
void do_sig_parent(int num){
printf("I am parent %d\t%d\n", getpid(), n);
n += 2;
flag = 1;
//sleep(1);
}
int main()
{
pid_t pid;
struct sigaction act;
if((pid = fork()) < 0)
sys_err("fork");
else if(pid > 0){
n = 1;
sleep(1); //保证子进程注册信号的工作能完成
act.sa_handler = do_sig_parent;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGUSR2, &act, NULL); //注册自己的信号捕捉函数 父使用SIGUSR2信号(子进程发送)
do_sig_parent(0); //直接调用捕捉函数,父进程先开始数数
while(1){
/*wait for signal*/
if(flag == 1){
kill(pid,SIGUSR1); //给子进程发信号
//---------失去cpu--------
flag = 0;
}
}
}
else if(pid==0){
n = 2;
act.sa_handler = do_sig_child;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGUSR1, &act, NULL); //父进程数数完成发送SIGUSR1给子进程
while(1){
/*wait for signal*/
if(flag == 1){
kill(getppid(), SIGUSR2);
flag = 0; //已经给父进程发送完信号
}
}
}
return 0;
}
结果: