• 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
    ",num,c_cnt);
        c_cnt+=2;
        sleep(1);
    }
    void parent_h(int num)
    {
        printf("sig=%d ,父进程报数:%d
    ",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!
    ");
            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("子进程
    ");
                int cnt=0;
                ret=kill(getppid(),SIGUSR2);
                if(ret<0)
                    perror("子进程error kill
    ");
                sleep(1);
           }        
        }
        else//父进程
        {
           while(1)
           {
                parent_h(SIGUSR2);
                sigprocmask(SIG_BLOCK,&old,NULL);//回到原状态
                ret=kill(pid,SIGUSR1);
               // printf("父进程已经发送
    ");
                if(ret<0)
                    perror("父进程error kill
    ");
                sleep(1);
           }
        }
        return 0;
    }
    

     运行结果如下:

     

  • 相关阅读:
    深入浅出 JVM ClassLoader
    JVM 线上故障排查基本操作
    深入浅出 JVM GC(3)
    MyBatis 源码分析系列文章合集
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析系列文章导读
  • 原文地址:https://www.cnblogs.com/Burgess-Fan/p/12765172.html
Copyright © 2020-2023  润新知