Linux進程間通訊:父子進程經過信號通訊,實現交替數數,時間間隔1秒

/*===============================================================
*  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;
}

 運行結果以下:測試