#include<signal.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int num=0;
pid_t pid;
/*<span style="font-family: Arial, Helvetica, sans-serif;">利用捕捉signal里的自定义信号,来实现进程通信</span><span style="font-family: Arial, Helvetica, sans-serif;">*/</span>
</pre><pre name="code" class="cpp">void sys_err(char *str) //容错
{
perror(str);
exit(1);
}
void do_sig_parent(int n) // 父进程 做累加
{
printf("p %d \n",num);
num += 2;
kill(pid,SIGUSR1); //num+完后给子进程发送sigusr1信号
}
void do_sig_child(int n) //子进程 做累加
{
printf("p %d \n",num);
num += 2;
kill(getppid(),SIGUSR1); // 利用getppid获取父进程号,发送信号
}
int main(void)
{
struct sigaction act;
sigset_t set;
sigemptyset(&set);
sigaddset(&set,SIGUSR1);
sigprocmask(SIG_BLOCK,&set,NULL);
//首先给该信号设为阻塞,目的是当父进程执行完给子进程发送信号时,子进程并没有准备好,那么子进程接受到信号后便会采取默认动作,程序挂掉
if((pid = fork()) < 0)
{
sys_err("fork");
}
else if(pid == 0)
{
act.sa_handler = do_sig_child;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGUSR1,&act,NULL);
num = 2;
sigprocmask(SIG_UNBLOCK,&set,NULL); //子进程结锁,即将阻塞信号集相应位置空
while(1)
{
sleep(1);
}
}
else
{
act.sa_handler = do_sig_parent;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGUSR1,&act,NULL);
num = 1;
sigprocmask(SIG_UNBLOCK,&set,NULL);
raise(SIGUSR1); //设置完成后,给自己发送一个该信号,激活程序
while(1)
{
sleep(1);
}
}
return 0;
}