zoukankan      html  css  js  c++  java
  • 父、子进程中的全局变量

    子进程创建以后,会继承父进程的全局变量,但是继承的是父进程刚开始全局变量的值。

    但是子进程创建以后,子进程修改了变量,或者父进程修改了全局变量的值,父子进程就互相都不影响了。

     

    /* 
    用信号模拟司机售票员问题:创建子进程代表售票员,父进程代表司机 ,同步过程如下: 
    1 售票员捕捉SIGINT(代表开车),发SIGUSR1给司机, 
    司机捕捉到该信号之后打印(“move to next station”)。 
    2 售票员捕捉SIGQUIT(代表靠站),发SIGUSR2给司机, 
    司机捕捉到该信号之后打印(“stop the bus”)。 
    3 司机捕捉SIGTSTP(代表车到总站),发SIGUSR1给售票员, 
    售票员捕捉到该信号之后打印(“all get off the bus”)。 
     
    */  
      
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <signal.h>  
    #include <sys/types.h>  
    #include <sys/stat.h>  
    #include <fcntl.h>  
      
    static pid_t pid_child, pid_parent;  
      
    void child_handler(int sig)  
    {    
        if (sig == SIGINT)  
        {  
    //      kill(pid_parent, SIGUSR1);  //错误,此时pid_parent = 0  
            kill(getppid(), SIGUSR1);   //正确  
        }  
          
        if (sig == SIGQUIT)  
        {     
    //      kill(pid_parent, SIGUSR2);  //错误,此时pid_parent = 0  
            kill(getppid(), SIGUSR2);   //正确  
        }  
          
        if (sig == SIGUSR1)  
            printf("all get off the bus
    ");  
    }  
      
    void parent_handler(int sig)  
    {  
        if (sig == SIGUSR1)  
            printf("move to next staion
    ");  
          
        if (sig == SIGUSR2)  
            printf("stop the bus
    ");  
          
        if (sig == SIGTSTP)  
            kill(pid_child, SIGUSR1);  
    }  
      
    int main(void)  
    {  
        pid_t ret;  
          
        ret = fork();  
          
        if (ret < 0)  
        {  
            printf("fork fail");  
            exit(1);  
        }  
        else if (ret == 0)  
        {  
            /* child process */  
            signal(SIGTSTP, SIG_IGN);  
      
            signal(SIGINT, child_handler);  
            signal(SIGQUIT, child_handler);  
            signal(SIGUSR1, child_handler);  
              
            while (1)  
            {  
                pause();  
            }  
        }  
        else  
        {  
            /* parent process */  
            pid_child = getpid();  
    //      pid_parent = getpid();  
      
            printf("pid_child = %d
    ", pid_child);  
            printf("pid_parent = %d
    ", pid_parent);  
              
            signal(SIGINT, SIG_IGN);  
            signal(SIGQUIT, SIG_IGN);  
      
            signal(SIGUSR1, parent_handler);  
            signal(SIGUSR2, parent_handler);  
            signal(SIGTSTP, parent_handler);  
              
            while (1)  
            {  
                pause();  
            }  
        }  
      
        return 0;  
    }  
  • 相关阅读:
    周末郑州程序员朋友技术交流中的PPT
    WCF并发连接数的问题
    郑州.Net技术人员的招聘信息
    在路上
    Windows8体验(1)安装
    挖掘0day打进不同学校
    记一次绕过宝塔防火墙的BC站渗透
    一次实战中对tp5网站getshell方式的测试
    一次从弱口令到getshell
    一次HW实战
  • 原文地址:https://www.cnblogs.com/lialong1st/p/7756667.html
Copyright © 2011-2022 走看看