天天看點

linux程序間通訊(1)管道通信原理

Unix IPC包括:管道(pipe)、命名管道(FIFO)與信号(Signal)

管道(pipe)

管道可用于具有親緣關系程序間的通信,有名管道克服了管道沒有名字的限制,是以,除具有管道所具有的功能外,它還允許無親緣關系程序間的通信;

實作機制:

管道是由核心管理的一個緩沖區,相當于我們放入記憶體中的一個紙條。管道的一端連接配接一個程序的輸出。這個程序會向管道中放入資訊。管道的另一端連接配接一個程序的輸入,這個程序取出被放入管道的資訊。一個緩沖區不需要很大,它被設計成為環形的資料結構,以便管道可以被循環利用。當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入資訊。當管道被放滿資訊的時候,嘗試放入資訊的程序會等待,直到另一端的程序取出資訊。當兩個程序都終結的時候,管道也自動消失。

linux程式間通訊(1)管道通信原理

從原理上,管道利用fork機制建立,進而讓兩個程序可以連接配接到同一個PIPE上。最開始的時候,上面的兩個箭頭都連接配接在同一個程序Process 1上(連接配接在Process 1上的兩個箭頭)。當fork複制程序的時候,會将這兩個連接配接也複制到新的程序(Process 2)。随後,每個程序關閉自己不需要的一個連接配接 (兩個黑色的箭頭被關閉; Process 1關閉從PIPE來的輸入連接配接,Process 2關閉輸出到PIPE的連接配接),這樣,剩下的紅色連接配接就構成了如上圖的PIPE。

linux程式間通訊(1)管道通信原理

代碼實作:

該代碼段實作了将檔案a中的内容讀取到buf1,通過管道寫入到檔案b中。

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <string.h>
#include<stdlib.h>
#include<unistd.h>


int main()
{
    int fd[2];
    int pid;
    int fd1;
    int fd2;
    int size;
    char buf[128]={'\0'};
    char buf1[128]={'\0'};
if(pipe(fd)==-1)
    {
        printf("create pipe error\n");
    }
    pid=fork();
    if(pid<0)
    {
        printf("create error");
    }
    else if(pid>0)
    {
        printf("this is father\n");
        close(fd[0]);
        fd1=open("1.txt",O_RDWR);
        read(fd1,(void *)buf1,128);
        write(fd[1],buf1,128);
    }
    else
    {
        printf("this is child\n");
        close(fd[1]);
        read(fd[0],(void *)buf,128);
        size= strlen(buf);
        fd2=open("2.txt",O_RDWR|O_CREAT|O_TRUNC,0600);
        write(fd2,buf,size);
        printf("%s\n",buf);
    }
    return 0;


}
           

繼續閱讀