常規的匿名管道通過pipe建立一片記憶體緩衝區,並對外提供兩個檔案描述符,用於唯讀或者只寫操作。但其使用範圍很小,只能用於父、子程序間的通訊。因此linux還提供有名管道的支援。
管道的本質是一片可以讀寫的緩衝區域,linux將其描述為檔案(unix思想:一切io皆是檔案) 對於有名管道,其主要特點是:
【有名管道的建立】
mkfifo(const char* filename,mode) //建立指定名字的管道檔案 並指明mode
【讀端】int main()
return 0;
}
首先通過access判斷管道檔案是否存在,如果不在,那麼mkfifo建立乙個管道檔案。
然後,不斷的通過read從管道讀取字元,並顯示。
當接收的字元為'q'時,結束程式
int main(int argc, char *ar**)
{ int i, ret, fd;
char p_flag = 0;
if (access("./myfifo", 0) < 0) { //先判斷有名管道檔案是否存在,不存在需要先建立
ret = mkfifo("./myfifo", 0777); //許可權
if (ret < 0) {
cout<
分別啟動寫入端程式,讀取端程式,執行結果:
由此可見,有名管道 named pipe 其主要特點是:
提供了一種多程序之間通訊的方式,本質是多程序讀取同一片記憶體緩衝區。
相較於匿名管道,由於採取了檔名標識,可以在不是父子程序關係之間通訊。
對管道的讀寫操作與其它檔案操作類似,linux通過vfs進行抽象統一描述。(一切io皆是檔案思想)
程序間通訊 有名管道
無名管道,由於沒有名字,只能用於親緣關係的程序間通訊.為了克服這個缺點,提出了有名管道 fifo fifo不同於無名管道之處在於它提供了乙個路徑名與之關聯,以fifo的檔案形式存在於檔案系統中,這樣,即使與fifo的建立程序不存在親緣關係的程序,只要可以訪問該路徑,就能夠彼此通過fifo相互通訊,因...
程序間通訊 有名管道
mkfifo test 這條命令建立了乙個名字為 test 的命名管道。接下來我們用乙個程序向這個管道裡面寫資料,然後有另外乙個程序把裡面的資料讀出來。echo this is a pipe test 寫資料 這個時候管道的內容沒有被讀出的話,那麼這個命令就會一直停在這裡,只有當另外乙個程序把 te...
Linux程序間通訊 管道(有名管道
時隔很久,再來更博.今天主要寫的是linux中程序間通訊,程序間進行通訊的目的就是多個程序之間資料互相交換。程序間通訊方式有以下幾種 1 訊號 2 管道 分為有名管道和無名管道 3 訊號量 4 訊息佇列 5 共享儲存 共享記憶體 6 套接字 socket 其中套接字屬於多機通訊 全雙工通訊 其餘的屬...