/*===============================================================
* Copyright(C) 2020 Burgess Fan aLL rights reserved.
*
* 文件名称:ttt.c
* 创 建 者:Burgess
================================================================
*/
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
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;
}
运行结果如下: