管道(pipe):是⼀一種最基本的ipc機制,由pipe函式建立
#include
int pipe(int filedes[2]);
呼叫pipe函式時在核心中開闢一塊緩衝區(稱為管道)用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描符,filedes[0]指向管道的讀端,filedes[1]指向管道的寫端(很好記,就像0是標準輸⼊入1是標準輸出一樣)。所以管道在⽤使用者程式看起來就像乙個開啟的檔案,通過read(filedes[0]);或者write(filedes[1]);向這個檔案讀寫資料其實是在讀寫核心緩衝區。pipe函式呼叫成功返回0,呼叫失敗返回-1。
開闢了管道後按下面步驟進行通訊:
1.父程序呼叫pipe開闢管道,得到兩個檔案描述符指向管道的兩端。
2.父程序呼叫fork建立子程序,那麼子程序也有兩個檔案描述符指向同一管道。
3.父程序關閉管道讀端,子程序關閉管道寫端。父程序可以往管道裡寫,子程序可以從管道裡讀,管道是用環形佇列實現的,資料從寫端流入從讀端流出,這樣就實現了程序間通訊。
測試管道容量演示**:
#include
#include
#include
#include
int main()
//管道容量的計算
pipe_size = fpathconf(p[0], _pc_pipe_buf);
printf("maximum size of write to pipe: %d bytes\n", pipe_size);
}
結果如下:
[snow@localhost pipe]$ ./pipe
maximum size of write to pipe: 4096 bytes
說明我當前的作業系統中管道最多可以寫入4096位元組的內容。
管道的實現機制:
管道是由核心管理的乙個緩衝區,相當於我們放入記憶體中的乙個紙條。管道的一端連線乙個程序的輸出。這個程序會向管道中放入資訊。管道的另一端連線乙個程序的輸入,這個程序取出被放入管道的資訊。乙個緩衝區不需要很大,它被設計成為環形的資料結構,以便管道可以被迴圈利用。當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入資訊。當管道被放滿資訊的時候,嘗試放入資訊的程序會等待,直到另一端的程序取出資訊。當兩個程序都終結的時候,管道也自動消失。
以上所講的管道都沒有名字,這是它的不足之處,所有其只能用於具有親緣關係的程序間通訊。而在命名管道(named pipe或fifo)提出後,該限制得到了克服。
命名管道(fifo):命名管道是一種特殊型別的檔案,它在系統中以檔案形式存在。這樣克服了管道的弊端,他可以允許沒有親緣關係的程序間通訊。
linux下有兩種⽅方式建立命名管道:
一是在shell下互動地建立乙個命名管道,shell方式下可使用mknod或mkfifo命令;
mknod namedpipe
二是在程式中使用系統函式建立命名管道,建立命名管道的系統函式有兩個:mknod和mkfifo。兩個函式均定義在標頭檔案sys/stat.h,
函式原型如下:
#include
#include
int mknod(const
char *path,mode_t mod,dev_t dev);
int mkfifo(const
char *path,mode_t mode);
函式mknod引數中path為建立的命名管道的全路徑名:mod為建立的命名管道的模式,指明其訪問許可權;dev為裝置值,該值取決於檔案建立的種類,它只在建立裝置檔案時才會用到。這兩個函式呼叫成功都返回0,失敗都返回-1。
命名管道建立後就可以使用了,命名管道和管道的使用方法基本是相同的。只是使用命名管道時,必須先呼叫open()將其開啟。因為命名管道是乙個存在於硬碟上的檔案,而管道是存在於記憶體中的特殊檔案。需要注意的是,呼叫open()開啟命名管道的程序可能會被阻塞。但如果同時用讀寫方式(o_rdwr)開啟,則一定不會導致阻塞;如果以唯讀方式(o_rdonly)開啟,則呼叫open()函式的程序將會被阻塞直到有寫方開啟管道;同樣以寫方式(o_wronly)開啟也會阻塞直到有讀方式開啟管道。
管道和命名管道的區別:
管道,只能用於具有親緣關係的程序間通訊;
命名管道fifo,不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中,程序與建立fifo的程序不存在親緣關係,只要可以訪問該路徑,就能夠通過fifo相互通訊。
Linux下程序間通訊方式 pipe(管道)
每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序a把資料從使用者空間拷到核心緩衝區,程序b再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊。不同程序間的通訊本質 程序之間可以看到乙份公共資源...
程序間通訊方式 管道通訊
c語言中的管道通訊是通過在核心中開闢一塊空間,使用者通過檔案io介面來訪問這塊空空間實現通訊目的。管道的優點是直接訪問記憶體,通訊速度較快。缺點是一方面管道屬於半雙工的通訊,即同一程序只能讀或者寫,無法同時讀寫同一管道。另一方面管道中的資料只能讀一次,無法重複讀取。程序通過檔案io來操作管道,但是不...
程序間通訊方式 管道
1.管道的建立 管道是由呼叫pipe函式來建立 include int pipe int fd 2 返回 成功返回0,出錯返回 1 是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係 父子程序 的程序間使用。2.有名管道和無名管道的區別 有名管道 可以在任意兩個程序之間,有名的名字存在...