程序間通訊 無名管道

2021-08-09 13:44:07 字數 1263 閱讀 2348

在上次的部落格中,我給大家介紹了程序間通訊的方式-有名管道。管道分為有名管道和無名管道,那麼此次我將給大家介紹一下另一種管道通訊-無名管道。

有名管道是可以應用於任何兩個程序之間資料的單向傳遞,而無名管道是相對於有名管道的,無名管道在使用時產生,不使用後釋放,並不會在系統上留下任何痕跡。

無名管道因其使用前沒有任何的標示,所以它只能應用於父子程序之間。原因是:呼叫fork函式父程序產生子程序後,子程序會通過淺拷貝的方式複製父程序的檔案表陣列,所以父程序和子程序可以通過同一指標訪問同一記憶體區域。

無名管道的操作:

建立:int pipe(int fd[2]),其中fd[0]代表的是讀操作,fd[1]代表的是寫操作

開啟:int pipe(int fd[2])

讀    :read(fd[0],buff,size)

寫    :write(fd[1],buff,len)

關閉:close(fd[0])--關閉讀操作

close(fd[1])--關閉寫操作

注意:只要是管道通訊都是半雙工通訊,而無名管道建立後,父程序在fork產生了子程序後,兩個程序分別有一對讀寫,所以,要在父子程序分別關閉讀寫。如果在父程序中關閉讀操作,那麼在子程序中就應該關閉寫操作,反之亦然。

下面請看例題:a 程序負責迴圈接受使用者輸入的資料,以」end」為結束標誌,b 程序負責統計使用者輸入的單詞個數。顯示到介面上。要求用無名管道的方式實現。

**如下:

#include #include #include #include #include #include #include int main()

; while(1)

printf("num=%d\n",num);

memset(buff,0,strlen(buff));//清空buff

}close(fd[0]);

}else//父程序寫入資料

;fgets(buff1,128,stdin);

write(fd[1],buff,strlen(buff)-1);//寫入資料

if(strncmp(buff,"end",3)==0)

}close(fd[1]);}}

測試檔案:

據上圖測試**所示,使用者可以迴圈輸入,且可以顯示總共輸入的資料個數,當輸入的資料為end時,程式結束。





程序間通訊 無名管道

1.無名管道 pipe 2.有名管道 fifo 3.訊號 signal 4.共享記憶體 share memory 5.訊息佇列 message queue 6.訊號燈集 semaphore set 7.套接字 1.只能用於具有親緣關係的程序之間的通訊 父子或兄弟程序 2.彈弓的通訊模式,具有固定的讀...

程序間通訊 有名管道 無名管道

顧名思義,管道就像是將資料放入到乙個長長的管子中一樣,肯定會有一端寫入資料,稱為寫端,有一段讀出資料,稱為讀端。既然是說像管子一樣那麼它肯定有大小吧,資源不是無窮無盡的,預設下管道的大小是64k,用ulimit a 可以檢視。1 無名管道 管道是半雙工的,資料只能向乙個方向流動 需要雙方通訊時,需要...

程序間通訊(2) 無名管道

1.無名管道 1.1 概念 相對於有名管道,沒有名稱,不能在任意程序之間使用,只能應用與父子程序之間,其原理是父子之間共享檔案描述符,所以fork 之前開啟無名管道 1.2建立並開啟 int pipe int fd 2 函式庫裡 fd 0 寫端 fd 1 讀端 1 include 2 include...