程序間通訊 管道

2021-08-02 01:34:29 字數 3304 閱讀 9620

管道是⼀一種最基本的 ipc機制,由pipe函式建立。

#include

int pipe(int fileds[2])

呼叫pipe函式時在記憶體中開闢一塊緩衝區(就稱為管道),用於通訊,它有乙個讀端和乙個寫端,通過函式引數傳給使用者程式兩個檔案描述符,fileds[0]指向管道的讀端,fileds[1]指向管道的寫端。(方便記憶就可以理解為,標準輸入0,標準輸出1)看起來管道就像是乙個開啟的檔案, 通過read(fileds[0]),和write(fileds[1])往裡面寫和讀, 從上面的圖我們可以看出,也就是在讀寫核心緩衝區。 pipe函式建立管道成功返回0,失敗返回-1。

1.父程序建立管道

2.父程序fork出子程序

3.父程序關閉fd[0],子程序關閉fd[1]

if(id<0)//建立子程序失敗

else

if(id==0)

}else}}

執行結果:

管道的特點:

1.匿名管道支援單方向通訊。

2.管道通訊依賴於檔案系統。

所以管道的生命週期是隨程序。(程序一旦結束,管道也就隨之而被釋放)

3.匿名管道只能用於兩個具有親緣關係的兩個程序。(例如父子程序)

4.匿名管道是按照位元組流的方式來進行讀寫的。(沒有格式要求)

5.管道自帶同步機制。(讀寫的順序一致)

匿名管道存在著如下兩個缺點

1. 匿名管道只能用於連線具有共同祖先的程序。

2. 匿名管道是依附程序而臨時存在的。

但是 命名管道可以在任意的檔案之間通訊。

命名管道(namedpipe)是伺服器程序和乙個或多個客戶程序之間通訊的單向或雙向管道。不同於匿名管道的是:命名管道可以在不相關的程序之間和不同計算機之間使用,伺服器建立命名管道時給它指定乙個名字,任何程序都可以通過該名字開啟管道的另一端,根據給定的許可權和伺服器程序通訊。而且,fifo總是按照先進先出的原則工作,第乙個被寫入的資料首先從管道中讀出。

建立命名管道的系統函式有兩個:mknod和mkfifo

函式原型:

#include

#include

int mknod(const

char*path,mode_t mod,dev_t dev);

int mkfifo(const

char*path,mode_t mode);

函式引數中的path為建立的命名管道的路徑名,mod為建立命名管道的模式,指明其訪問許可權,dev為裝置值,該值檔案建立的種類,它只在建立裝置檔案時才會用到。這兩個函式帶哦用成功返回0,失敗都返回-1.線面用mknod函式建立乙個命名管道

umask(0);//重置管道的訪問許可權

if(mknod("/tmp/fifo",s_ififo|0666)==-1)

//函式mkfifo的使用**

umask(0);

if(mkfifo("/tmp/fifo",s_ififo|0666)==-1 )

//"s_ififo|0666"致命建立乙個管道的訪問許可權為0666

命名管道的使用和匿名管道基本相同,只是在使用命名管道之前首先要使用open函式開啟,因為命名管道是存在於硬碟上的檔案,而管道是存在於記憶體中的特殊檔案。

需要注意,使用open的幾點:

1. 呼叫open()開啟命名管道可能會被阻塞,但是如果同時用讀寫方式(o_rdwr)開啟,則一定不會造成阻塞。

2. 如果以制度方式(o_rdonly)開啟,則呼叫open()函式的程序將會被阻塞直到有寫才能開啟管道。

3. 同樣,以寫方式(o_wronly)開啟也會阻塞直到有讀方式開啟管道。

命名管道可以實現程序間的通訊:

管道的寫端

#include

#include

#include

#include

#include

#include

int main()

int fd = open("./mypipe",o_rdonly);

if(fd<0)

char buf[1024];

while(1)

else

if(ret==0)

}close(fd);

return

0;}

管道的讀端

#include

#include

#include

#include

#include

#include

int main()

char buf[1024];

while(1)

}close(fd);

return

0; }

執行結果:

匿名管道和命名管道:首先,fifo是一種永久性的機構,它具有普通的unix系統檔名。在系統下可利用mknod命令建立永久的管道,除非刻意刪除它,否則它將一直保持在系統中。

其次,正是由於有名管道以「檔名」來標識,所以只要事先約定某一特定檔名,那樣所有知道該約定的服務程序,不論它們之間是否有親屬關係,都可以便利地利用管道進行通訊。

命名管道檔案被建立後,一些程序就可以不斷地將資訊寫入命名管道檔案裡,而另一些程序也可以不斷地從命名管道檔案中讀取資訊。對命名管道檔案的讀寫操作是可以同時進行的。

程序間通訊 管道

include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...

程序間通訊 管道

原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...

程序間通訊 管道

程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...