進程間通信————管道

進程間通信
首先,每個進程有各自不同的地址空間,任何一個進程都不能看到別的進程的系統資源。因此,進程間通信的主要方式是通過內核,首先在內核中開闢出一個緩衝區。把進程1的要溝通的數據寫到緩衝區中去,然後通過進程2讀走緩衝區的內容,這樣才實現了進程間的通信(IPC)。
這裏寫圖片描述
一、匿名管道
1.管道是一種簡單的進程間通信方法,有IPC機制。通過調用pipe函數在內核中創建出緩衝區(管道)
#include < unistd.h >
int pipe(int filedes[2]);

通過輸出型參數傳出文件描述符(以前的文章介紹過)。其中filedes[0]指向讀端,filedse[1]指向寫端。
就如同打開一個文件一樣。成功返回0,失敗返回-1。
2.匿名管道的通信步驟:
通過父進程調用pipe創建管道,得到兩個文件描述符指向管道,在fork()出子進程,子進程也有兩個文件描述符共同指向管道。關閉相應的文件描述符讀寫端,就可以進行通訊。
這裏寫圖片描述

#include<stdio.h>
#include<error.h>
#include<unistd.h>
#include<string.h>
int main()
{
    int fd[2];
    int ret=pipe(fd);
    if(ret==-1)
    {
        perror("pipe");
        return -1;
    }
    pid_t id=fork();
    if(id<0)
    {
    perror("fork");
    return 1;
    }
    else if(id==0)
    {
        //child
        close(fd[0]);//close read
        int i=0;
        char *str=NULL;
        while(i<10)
        {
            str="i am your child";
            write(fd[1],str,strlen(str)+1);
            sleep(1);
            i++;
        }
    }
    else{
    //father
     close(fd[1]);//close write
     char msg[100];
     int j=0;
     printf("father:\n");
     while(j<10)
     {
         memset(msg,'\0',sizeof(msg));
         read(fd[0],msg,sizeof(msg));
         printf("%s \n",msg);
         j++;
     }
    }
    return 0;
}

運行結果:
父進程打印出消息。如果要進行父進程寫入,子進程讀只需要關閉子進程的寫端,父進程的讀端。
這裏寫圖片描述
3.匿名管道的特點:
①.這種管道通信只適用於單向通信。
②.常常用於父子間的通信,而且一定要具有血緣關係,比如父子進程,爺孫進程,兄弟進程等等。
③.管道的生命週期,隨着進程結束而結束。
④.管道通信,面向字節流的通信。
⑤.管道通信自帶同步機制。
4.匿名管道的幾種特殊情況:
①.寫端寫滿後停滯,等待讀端讀。
②.寫端一直不寫,讀端處於阻塞狀態等待。
③.讀端關閉,寫端會被操作系統終止,(收到來自進程的SIGPIPE)。
④.寫端停止,等待讀端讀取,最後關閉,返回0。
二、命名管道(FIFO)
匿名管道的一個不足之處在於它沒有名稱。因此誕生了命名管道,命名管道某種程度上可以看做是匿名管道,但是他可以進行非血緣關係進程間的通信。之所以能夠這樣,是因爲它可以通過同一個路徑名而看到同一份資源,這份資源以FIFO的文件形式存在於文件系統中。
管道的創建:

 #include< sys/types.h >
 #include< sys/stat.h >
 int mkfifo(const char * filename ,mode_t mod);
 int mkfifo(const char * filename ,mode_t mod |   S _IFIFO,(dev_t)0);


兩個函數都是創建文件。
filename是文件名,mod是操作權限。因爲創建文件在系統中,讀寫操作都是對文件的操作,對於匿名管道那種不可見的操作,這種做法更突出可見性。因爲命名管道是一個文件,可以用於任何兩個進程的通信。

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