物語を完了するために3分は、プロセス間の同期信号メカニズムを学びます

成功した人は他の人が彼に投げてきた.--------成功した人々は他の人々が強固な基盤を構築するために彼のレンガを失うことに使用するレンガとの確固たる基盤を築くことができるものです。

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、どのようにプロセス間通信信号を達成するために

私たちは以下のコードでそのような事を成し遂げる下:
私の父は、親プロセスである、と私は黒の子プロセスです。
そしてある日、父が仕事から家に来たが、ブロックされた親プロセスに代わって(、、ドアのところがノックされた、実際には、ドアが開いていた、彼はドアを開こうとしなかったキーを取り、その後トイレに急いではありませんでした外、トイレに家庭に入ることができない)
)私は黒の音楽を聞いていたものが(子供に代わって自分のことをやってみたかったが、残念ながら、この時間、そして最後に、私は歌を聞いて、私は熱心な父親のドアをノックを聞きました音が、私は大声で、「オープンドア」を叫んだ(つまり、親プロセスにシグナルを送信)
し、最終的にトイレに急いで父は、ドアをロックし、
この時間黒あまりにもひどく、だけでなく、トイレに行きます、 (私の父は私に信号を送った)私の父と私が話し終えたまで、私はトイレにすることができ、これは子プロセスがブロックされている、完了するまでに急いで父を促す、トイレのドアをノックし続け、している
し、その後、私の父は、ショッピングに行くに連れて行ってくれました、、トイレを使った後私を待って
、最後の物語の終わりを。
ここに画像を挿入説明
今、私たちはコードを実現します:

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

ここに画像を挿入説明

これは、父と息子の間の同期の問題のプロセスを完了します。

公開された29元の記事 ウォン称賛65 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_46027505/article/details/105143121