Linux 程序間通訊之管道

2021-10-05 19:29:22 字數 3109 閱讀 6223

程序間通訊的機制包括:管道、訊號量、共享記憶體、訊息佇列。

這篇部落格主要介紹的是程序間通訊之管道的應用

一、管道的分類

管道都屬於半雙工通訊機制

管道分為有名管道和無名管道

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是各種程序通訊方式的統稱 ...