天天看點

程序間通訊-有名管道

  程序間通信:是指多個程序之間資料互相轉換。

  程序間通訊的方式:

      單機通訊:信号、管道(有名管道、無名管道)、信号量、消息隊列、共享存儲

      多機通訊:套接字(socket)

  管道通訊的原理

程式間通訊-有名管道

  有名管道:應用于任意兩個程序之間資料的單向傳遞

  管道操作:建立   指令方式:mkfifo       函數方式:mkfifo();

                    打開   open

                    讀資料   read

                    寫資料   write

                    關閉   close

   因為管道檔案建立之後,之後的操作就和普通檔案操作一樣,那我在此就不再進行具體的說明了。

   在此說明一下,有名管道隻是在檔案目錄樹中有一個檔案标示,它實際上并不占據磁盤空間,而是将資料緩存在記憶體上。

   有名管道特性:阻塞運作

       阻塞運作函數:函數調用以後并不會立即傳回,需要等待某些條件的發生才會傳回。

       open操作管道檔案

      (1)如果一個程序是以隻寫的方式打開一個管道檔案,那麼open函數會阻塞運作,直到另一個程序以讀的方式(不管是隻讀還是讀寫)打開管道檔案。open函數才會傳回,程序才會接着運作。

      (2)如果一個程序是以隻讀的方式打開一個管道檔案,那麼open函數會阻塞運作,直到另一個程序以寫的方式(不管是隻寫還是讀寫)打開管道檔案。open函數才會傳回,程序才會接着運作。

       read函數操作管道檔案----read函數操作管道檔案時也會阻塞運作,直到寫端寫入資料或者所有的寫端全都關閉。read函數讀取資料并且會将記憶體上的已讀資料清空。

   下面請看兩個代碼

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>

int main()
{
    int fd=open("FIFO",O_WRONLY);
    assert(fd!=-1);
    
    if(fd==-1)
    {
        exit(0);
    }
    printf("FIFO open success\n");
    
    write(fd,"hello world",10);
    printf("write success\n");
}
           
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>

int main()
{
    int fd=open("FIFO",O_RDONLY);
    assert(fd!=-1);
    
    if(fd==-1)
    {
        exit(0);
    }
    printf("FIFO open success\n");
    char buff[128]={0};
    
    read(fd,buff,127);
    printf("read data:%s\n",buff);
}
           

     如上面兩個代碼所示,如果單獨執行其中一個代碼,那麼将會沒有結果。要想代碼2中順利輸出代碼1中輸入到管道檔案中的資料,那麼在運作代碼1的同時運作代碼2.

   測試檔案如下:

單獨執行代碼1:

程式間通訊-有名管道

,程序a會阻塞運作,等待另一個程序b以讀方式打開

補充執行代碼2:

程式間通訊-有名管道

後的結果

程序a   

程式間通訊-有名管道

程序b

程式間通訊-有名管道

   上面的結果顯示程序a成功寫入資料,程序b也成功讀取了資料。兩個程序成功通過管道進行了通訊。

 

繼續閱讀