原文:
程序間通訊——管道
管道簡介
常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在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 指...