在上次的部落格中,我給大家介紹了程序間通訊的方式-有名管道。管道分為有名管道和無名管道,那麼此次我將給大家介紹一下另一種管道通訊-無名管道。
有名管道是可以應用於任何兩個程序之間資料的單向傳遞,而無名管道是相對於有名管道的,無名管道在使用時產生,不使用後釋放,並不會在系統上留下任何痕跡。
無名管道因其使用前沒有任何的標示,所以它只能應用於父子程序之間。原因是:呼叫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...