程序間通訊的機制包括:管道、訊號量、共享記憶體、訊息佇列。
這篇部落格主要介紹的是程序間通訊之管道的應用
一、管道的分類
管道都屬於半雙工通訊機制
管道分為有名管道和無名管道
1、有名管道
在磁碟上有乙個管道檔案標識,但是這個管道檔案只會佔據乙個inode點,但是這個管道檔案任何時候都不會佔據block塊。資料在傳遞過程中會快取到記憶體上。這就是有名管道。
管道檔案僅僅是為了使得不同的程序(有許可權操作)能夠共享
2、無名管道
沒有管道檔案,借助父子程序共享fork之前開啟的檔案描述符,來實現程序間通訊。
二、建立有名管道檔案
1、建立有名管道檔案的方法
(1)命令:
mkfifo filename(2)庫函式:
int mkfifo()建立有名管道用到的庫函式的方法:open、read、write、close2、通過有名管道實現程序間通訊
(1)我們在系統上建立兩個檔案,乙個是maina.c乙個是mainb.c。maina.c用來寫檔案,mainb.c用來讀檔案。
#include
#include
#include
#include
#include
#include
intmain()
;printf
("input: ");
fgets
(buff,
127,
stdin);
if(strncmp
(buff,
"end",3
)==0)
write
(fd,buff,
strlen
(buff)-1
);}close
(fd)
;}
#include
#include
#include
#include
#include
#include
intmain()
;int n =
read
(fd,buff,
127);if
(n <=0)
printf
("read: %s\n"
,buff);}
close
(fd)
;}
(2)如果我們只在系統上執行maina.c我們發現什麼也沒有顯示:
這塊發生了阻塞,通過分析**:
write open fifo success
我們發現執行後這句沒有執行,證明是在前面的open處阻塞了,這是因為,open操作的管道檔案是以只寫的方法開啟的,沒有任何讀的方式去讀它,它就會發生阻塞(3)同樣如果我們只在系統上執行mainb.c的話,也是同樣的道理,發生阻塞
(4)當我們同時進行maina.c和mainb.c的操作時,會發現,當我們在maina.c中寫乙個檔案mainb.c中就會讀入乙個。
(5)原理
原理就是通過兩個程序在磁碟空間是共享的去訪問磁碟上的fifo結點,通過fifo結點最終會指向記憶體上的一塊空間,然後去寫入資料和讀取資料。
(6)注意事項
三、建立無名管道檔案
1、無名管道的建立與開啟:
int pipe(int fds[2]);建立無名管道用到的系統呼叫的方法:read、write、close
這塊沒有open是因為fds[2]中就已經包含了open的引數
2、通過無名管道實現程序間通訊
(1)我們只需建立乙個檔案pipe.c來實現
(2)我們發現子程序列印的東西在input之後。
這是因為:父程序將資料寫入之後直接輸出printf("input: ");
這個操作,不會等待子程序,只要write不阻塞,就會只執行自己的內容,子程序也是如此,父子程序執行相互之間沒有關係。
(3)原理
四、管道的特點
linux程序間通訊之管道通訊
一 命名管道通訊 管道通訊分為 無名管道和有名管道 無名管道是用於父子孫程序,之間有血緣關係 有名管道 用於任意兩個程序 無名管道 1 建立 int pipe int filedis 2 它會建立兩個檔案描述符 filedis 0 用於讀管道 filedis 1 用於寫管道 通常先建立乙個管道,再通...
linux程序間通訊之管道
下面幾節,將分別溫習下linux程序進通訊的幾種機制1 管道 管道是比較古老的程序間的通訊方式。主要有有名管道和無名管道兩種。2 無名管道 它的特點就是 1 只能使用在具有親緣關係的程序之間的通訊 父子程序或者兄弟程序之間 因為只有具有親緣關係的程序才能繼承其建立的檔案描述符。2 是乙個半雙工的通訊...
Linux程序間通訊之管道
管道,你可以把它想成一根資料線,連線了兩個程序,使他們可以互相通訊。更嚴謹來說,它是乙個檔案或者一塊共享區,乙個程序往裡面寫資料,另乙個程序從裡面拿資料,以此種方式完成程序間通訊。管道是unix系統ipc最古老的形式,所有的unix系統都提供此種通訊機制 unix系統ipc是各種程序通訊方式的統稱 ...