程序間通訊之管道
管道(無名管道)
無名管道的建立和使用函式
標頭檔案#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...