/*===============================================================
* 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;
}
運行結果以下:測試