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;
}

 运行结果如下:

 

posted @ 2020-04-24 08:50  弗莱曼飞侠  阅读(681)  评论(0编辑  收藏  举报