Linux程序間通訊 管道

2021-07-31 20:23:44 字數 2161 閱讀 9161

管道

管道是一種最基本的程序間通訊機制,由pipe函式建立:

#include

intpipe

(int filedes[2]

);

呼叫pipe函式時在核心中開闢一塊緩衝區(稱為管道)用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的寫端。向這個檔案讀寫資料其實是在讀寫核心緩衝區。pipe函式呼叫成功返回0,呼叫失敗返回-1。

管道**示例

子程序通過管道向父程序傳送資料。限制在父子程序間通訊。

#include

#include

#include

#include

#include

#include

int main (

)elseif(

0== pid)

else

return0;

}

兩個程序通過乙個管道只能實現單向通訊,比如上面的例子,子程序寫父程序讀,如果有時候也需要父程序寫子程序讀,就必須另開乙個管道。

命名管道

管道的使用有個限制,就是必須是父子程序間才可以通訊,如果不是父子程序是不能使用上面的管道通訊的,需要命名管道。

#include

#include

intmkfifo

(const

char

* pathname,mode_t mode)

;

依引數pathname建立特殊的fifo檔案,引數mode為該檔案的許可權。若成功則返回0,否則返回-1,錯誤原因存於errno中。

命名管道**示例

不必是父子程序間。程序a向程序b傳送資訊:

/* send process*/

#include

#include

#include

#include

#include

#include

#include

#include

int main ()}

int fd =

open

("comm"

, o_wronly);if

(fd <0)

char

* msg =

"process of send."

;write

(fd, msg,

strlen

(msg));

close

(fd)

;return0;

}

/* recv process*/

#include

#include

#include

#include

#include

#include

#include

#include

int main ()}

int fd =

open

("comm"

, o_rdonly);if

(fd <0)

char

* buf =

(char*)

malloc(80

);bzero

(buf,80)

;read

(fd, buf,80)

;printf

("recv from other process: %s\n"

, buf)

;close

(fd)

;free

(buf)

;return0;

}

特殊情況

使用管道需要注意以下4種特殊情況(假設都是阻塞i/o操作,沒有設定o_nonblock標誌):

其實和其他i/o事件的阻塞與同步是一樣的。

Linux程序間通訊 管道

linux程序間通訊機制 1.同一主機程序間通訊機制 unix方式 有名管道fifo 無名管道pipe 訊號signal systemv方式 訊號量 訊息佇列 共享記憶體 2.網路通訊 rpc remote procedure call socket 管道管道是程序間通訊中最古老的方式,它包括無名管...

Linux 程序間通訊 管道

程序間通訊 a程序怎樣將 hello world 傳遞給b程序 i 利用檔案實現 需要乙個 中間人 進行傳遞 檔案 在磁碟中儲存 a先呼叫open函式開啟檔案,再用write函式寫檔案,b用read函式讀取檔案,但問題如下 1.如果a傳送了資料b進行了接收,但a的資料沒有被清空 2.如果a傳送了資料...

LInux 程序間通訊 管道

管道是unix中一種程序間通訊的方法,我們把從乙個程序鏈結到另外乙個程序的資料流稱為 管道 管道是最像佇列的一種程序間通訊模型,生產者的程序在管道的寫端寫入資料,消費者的程序在管道的讀端進行讀取資料,這個過程類似於佇列,區別就是我們並不需要關心使用的管道的執行緒安全和記憶體分配等瑣碎的事情,這些事情...