3分钟故事学会用信号机制完成进程间同步

A successful man is one who can lay a firm foundation with the bricks others have thrown at him.--------成功的人会利用别人丢他的砖头来建构一个坚固的基础。

1, Linux下信号概念以及如何安装信号

小黑写过相关的博客,可以移步:
https://blog.csdn.net/weixin_46027505/article/details/104530022

2, 多进程回顾

下面是多进程编程以及进程的博客。需要了解的可以看看:
https://blog.csdn.net/weixin_46027505/article/details/105141592

https://blog.csdn.net/weixin_46027505/article/details/104812719

3, 如何利用信号实现进程间通信

下面我们用一段代码完成下面这样一件事情:
我爸爸就是父进程,小黑我就是子进程。
然后有一天,爸爸下班回家了,但是没带钥匙,然后急着上厕所,就一直在那里敲门,其实门是开着的,他却不试试开门,(这个就代表父进程阻塞在外面,无法进入家上厕所)
而这个时候不巧的事情,小黑我却在听音乐(代表子进程想干自己的事情),然后终于我听完了一首歌,听到了父亲急切的敲门声,我就大声喊了一声,“门是开着的”(就是给父进程发个信号)
终于爸爸冲向了厕所,把门锁了,
这时候小黑也很惨,也想上厕所了,就不断敲厕所门,催爸爸快点上完,这是就是子进程阻塞着,直到爸爸和我说上完了,我可以上厕所了(爸爸给我发的信号),
然后爸爸打算带我去shopping,就等着我上完厕所,
最后故事结束。
在这里插入图片描述
下面我们实现代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>


int wc_door = 0;   //厕所门关着的意思
int home_door = 0;  //爸爸以为家里的门是关着的

//爸爸上完厕所后告诉儿子上完了,小黑就知道厕所的门可以开了
void sig_child(int sig_num)
{
    if( SIGUSR1 == sig_num ) 
    {
        wc_door = 1;   
    }
}


//小黑告诉爸爸门是开着的,爸爸就知道门可以开了
void sig_parent(int sig_num)
{
    if( SIGUSR2 == sig_num ) 
    {
        home_door = 1;   
    }
}



int main(int argc, char *argv[])
{    
    int             pid; 
    int             wstatus;

    signal(SIGUSR1, sig_child);   
    signal(SIGUSR2, sig_parent);  
    
    if( (pid=fork()) < 0 )   
    {       
        printf("Create child process failure: %s\n", strerror(errno));     
        return -2;   
    }    
    
    //下面是子进程空间
    else if(pid == 0)   
    {       
        printf("xiaohei is listening to music\n");
        sleep(5);//听歌5分钟,没有听到爸爸敲门
        printf("xiaohei finish listen music and tell father door is open\n");//听完
        kill(getppid(), SIGUSR2);  //大声喊,告诉爸爸门是开着的
        sleep(3);
        while( !wc_door )     
        {            
            printf("xiaohei ask father to la baba quickly\n");
            sleep(1);   
        }       
        printf("xiaohei finish la baba\n");        
        return 0;  
    }


    //下面是父进程空间
    printf("father start knock the door\n");    //爸爸开始敲门
    while( !home_door )      //但是不知道门是开着的就一直敲
    {      
        sleep(1);
    }
   
   //听到小黑的声音,然后开门上厕所
    printf("father start running to WC and la xiang\n"); 
    sleep(10); //上厕所的时间
    printf("father tell xiaohei can come in wc\n");//告诉小黑自己上完了
    kill(pid, SIGUSR1); ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200327150910227.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjAyNzUwNQ==,size_16,color_FFFFFF,t_70#pic_center)
    printf("father wait me to go to shopping\n");
    wait(&wstatus);    
    printf("story over and we go to shopping\n");



    return 0;
}

在这里插入图片描述

这就完成了父子进程间同步的问题了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章