程序間通訊 管道

2021-07-09 15:22:01 字數 1525 閱讀 3117

原文:

程序間通訊——管道

管道簡介

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

顧名思義,匿名半雙工管道沒有名字,這個特性導致了它在應用方面的侷限性:

1.只能在有具有公共祖先的程序間通訊,即或是父子關係程序間、或是在兄弟關係程序間通訊。

2.資料只能在乙個方向上移動

管道建立

儘管這樣,半雙工管道還是linux系統上最常見的通訊方式。linux系統用pipe函式建立乙個半雙工管道,期函式原型為:

include

int pipe(int fd[2]);

引數fd是乙個長度為2的檔案描述符,fd[1]為輸入檔案描述符,fd[1]為輸出檔案描述符;函式返回型別為int,0表示成功,-1表示失敗。當成功返回時,則自動維護乙個從fd[1]到fd[0]的同行管道。

管道操作

對管道進行讀寫,可以通過write和read進行:

write(fd[1], "create the pipe successfully !\n", 31 ); /*向管道寫入端寫入資料*/

char str[256];

read(fd[0], str, sizeof(str) ); /*從管道讀出端讀出資料*/

讀寫時,需要注意的問題:

1.當輸出端關閉時,對輸入端的寫操作會產生訊號sigpipe,說明管道讀端已經關閉,並且write操作返回為–1,errno的值為epipe,對於sigpipe訊號可以進行捕捉處理。

2.read返回0說明管道中沒資料,但不能說明輸入端是否關閉

操作流程

1.建立管道

2.利用fork建立子程序

3.控制管道流向

4.從fd[1]向管道寫資訊

5.通過fd[0]從管道渡資訊

建立管道的標準庫函式

#include

file *popen( const char * command, const char *mode ); 

int pclose ( file *stream );  

示例引用《linux c程式設計大全》 中的例子

#include

#include

#include

#include

#define bufes pipe_buf /

* pipe_buf管道預設一次性讀寫的資料長度*

/int main ( void )if(

(pid = fork())

< 0 )

else

if( pid > 0 )

else

else

write(stdout_fileno, buf,

len);/

*輸出到標準輸出*

/exit

(0);}}

0 給主人留下些什麼吧!~~

程序間通訊 管道

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 ...

程序間通訊 管道

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

程序間通訊 管道

管道是 一種最基本的 ipc機制,由pipe函式建立。include int pipe int fileds 2 呼叫pipe函式時在記憶體中開闢一塊緩衝區 就稱為管道 用於通訊,它有乙個讀端和乙個寫端,通過函式引數傳給使用者程式兩個檔案描述符,fileds 0 指向管道的讀端,fileds 1 指...