無名管道和有名管道的特性,特點

2021-10-03 13:33:38 字數 2468 閱讀 7404

程序間通訊之管道

管道(無名管道)

無名管道的建立和使用函式

標頭檔案#include

函式int pipe(int filedes[2]);

int pipe(int filedes[2]);

功能:經由引數 filedes 返回兩個檔案描述符

引數:filedes 為 int 型陣列的首位址,其存放了管道的檔案描述符 fd[0]、 fd[1]。

filedes[0]為讀而開啟, filedes[1]為寫而開啟管道, filedes[0]的輸出是 filedes

[1]的輸入。

返回值:成功返回0,失敗返回-1

例項

#include #include int main(int argc, char *ar**)

else

}return 0;

}

半雙工

只能一端寫一端讀

資料先進先出

管道所傳送的資料是無格式的,這要求管道的讀 出方與寫入方必須事先約定好資料的格式,如多少位元組算乙個訊息等

不是普通檔案,只存在記憶體中

管道在記憶體中對應 乙個緩衝區不同的系統其大小不一定相同

數 據一旦被讀走,釋放空間寫更多的資料

管道沒有 名字,只能在具有公共祖先的程序之間使用

讀寫特點

預設用 read 函式從管道中讀資料是阻塞的

呼叫 write 函式向管道裡寫資料,當緩衝區已滿時 write 也會阻塞

通訊過程中, 讀埠全部關閉後,寫程序向管道內寫資料時,寫程序會(收到 sigpipe 訊號) 退出。

從管道中讀資料的特點 程式設計時可通過 fcntl 函式設定檔案的阻塞特性。 設 置為阻塞: fcntl(fd, fsetfl, 0); 設定為非阻塞: fcntl(fd, fsetfl, o_nonblock)

有名管道

有名管道建立和使用

標頭檔案#include #include

函式int mkfifo( const char *pathname, mode_t mode);

引數:pathname: fifo 的路徑名+檔名。

mode: mode_t 型別的許可權描述符。

返回值:成功返回0,失敗:如果檔案已經存在,則會出錯且返回-1。

例項

#include#include#include#includeint main(int argc, const char *ar**)

半雙工

資料遵循先入 先出的規則

fifo 所傳送的資料是無格式的,這要求 fifo 的讀出方與寫入方 必須事先約定好資料的格式,如多少位元組算乙個訊息

fifo 在檔案系統中 作為乙個特殊的檔案而存在,但 fifo 中的內容卻存放在記憶體中

管道在記憶體 中對應乙個緩衝區。不同的系統其大小不一定相同

數 據一旦被讀走,釋放空間寫更多的資料

當使用 fifo 的程序退出後, fifo 檔案將繼續儲存在檔案系統中以便以後使用

fifo 有名字,不相關的程序可以通過開啟命名管道進行通訊

有名管道讀寫的特點

系統呼叫的 i/o 函式都可以作用於 fifo,如 open、 close、 read、 write 等。

開啟 fifo 時,open 沒有位或 o_nonblock

open 以唯讀方式開啟 fifo 時,要阻塞到某個程序為寫而開啟此 fifo

open 以只寫方式開啟 fifo 時, 要阻塞到某個程序為讀而開啟此 fifo

open 以唯讀、只寫方式開啟 fifo 時 會阻塞,呼叫 read 函式從 fifo 裡讀資料時 read 也會阻塞

通訊過程中若寫 程序先退出了,則呼叫 read 函式從 fifo 裡讀資料時不阻塞;若寫程序又重新運 行,則呼叫 read 函式從 fifo 裡讀資料時又恢復阻塞

通訊過程中,讀程序退 出後,寫程序向命名管道內寫資料時,寫程序也會(收到 sigpipe 訊號)退出

呼叫 write 函式向 fifo 裡寫資料,當緩衝區已滿時 write 也會阻塞。

開啟 fifo 時,open 位或 o_nonblock

先以唯讀方式開啟:如果沒有程序 已經為寫而開啟乙個 fifo, 唯讀 open 成功,並且 open 不阻塞

先以只寫方式 開啟:如果沒有程序已經為讀而開啟乙個 fifo,只寫 open 將出錯返回-1

read、 write 讀寫命名管道中讀資料時不阻塞

通訊過程中,讀程序退出後, 寫程序向命名管道內寫資料時,寫程序也會(收到 sigpipe 訊號)退出

注意: open 函式以可讀可寫方式開啟 fifo 檔案時的特點: 1、 open 不阻塞。 2、呼叫 read 函式從 fifo 裡讀資料時 read 會阻塞。 3、呼叫 write 函式向 fifo 裡寫資料, 當緩衝區已滿時 write 也會阻塞。

無名管道和有名管道

無名管道 無名管道建立 int pipe int filedis 2 當乙個管道建立時,它會建立兩個檔案描述符 filedis 0 用於讀管道,filedis 1 用於寫管道 管道用於不同程序間通訊。通常先建立乙個管道,再通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道 有名管道 有...

管道 無名管道 和FIFO 有名管道

管道是最初的unixipc形式,但是因為管道沒有名字,所以它們只能用於有親緣關係的程序使用 進而有名管道 fifo 應運而生,有名管道有乙個路徑名與之關聯,所以允許無親緣關係的程序訪問同乙個fifo。以下具體介紹管道 管道的建立 管道由函式 int pipe int fd 2 建立,提供乙個單向資料...

無名管道和有名管道區別

管道 無名管道 1 管道通訊的原理 核心維護的一塊記憶體,有讀端和寫端 管道是單向通訊的 2 管道通訊的方法 父程序建立管理後fork子程序,子程序繼承父程序的管道fd 3 管道通訊的限制 只能在父子程序間通訊 半雙工 4 管道通訊的函式 pipe write read close 有名管道 fif...