程序間通訊(IPC) 管道

2021-10-03 03:59:56 字數 2872 閱讀 2160

二、fifo(命名管道)

參考

管道是一種最基本的ipc機制,作用於有血緣關係的程序之間,完成資料傳遞,呼叫pipe系統函式即可建立乙個管理。有如下性質:

1. 其本質是乙個偽檔案(實為核心緩衝區),所謂的偽檔案是指不佔磁碟空間大小的檔案,linux的檔案除了-ld,其它的sbcp等都是偽檔案。

2. 由兩個檔案描述符引用,乙個表示讀端,乙個表示寫端。乙個程序負責寫資料,另乙個程序負責讀資料。

3. 規定資料從管道的寫端流入,讀端流出,即單向傳遞。

管道的原理:管道實為核心使用環形佇列機制,借助核心緩衝區(4k)實現。

管道讀寫是通過標準的無緩衝的輸入輸出系統呼叫read()和write()實現的。系統呼叫read()將從乙個由管道檔案描述符所指的管道中讀取指定的位元組數到緩衝區中。如果呼叫成功,函式將返回實際所讀的位元組數。如果失敗,將返回-1。資料通過系統呼叫write()寫入管道。write()系統呼叫將資料從緩衝區向管道檔案描述符所指的管道中寫入資料。如果該系統呼叫成功,將返回實際所寫入的位元組數,否則返回-1。

(1)當沒有資料可讀時,read呼叫阻塞,即程序暫停執行,一直等到沒有資料來到為止。

(2)當管道滿的時候,write呼叫阻塞,直到有程序讀取資料。

資料自己讀不能自己寫。

資料一旦被讀走,便不在管道中存在,不可反覆讀取。

由於管道採用半雙工通訊方式,因此,資料只能在乙個方向上流動。

只能在有公共祖先的程序間使用管道。

管道的緩衝區是有限的(管道制存在於記憶體中,在管道建立時,為緩衝區分配乙個頁面大小);

管道所傳送的是無格式位元組流,這就要求管道的讀出方和寫入方必須事先約定好資料的格式,比如多少位元組算作乙個訊息(或命令、或記錄)等等;

#include

intpipe

(int filedes[2]

);// return value

// on success, zero is returned.

// pipefd[0] 讀端 --> 類似 stdin == 0

// pipefd[1] 寫端 --> 類似 stdout == 1

#include #include #include #include #include void sys_err(const char *str)

int main(void)

else if (pid == 0)

else

return 0;

}

無論是父程序,還是子程序,退出前記得關閉檔案描述符。

以上描述的是無名管道,管道還有另一種形式:fifo,也稱為命名管道,它是一種檔案型別

1、可以使非血緣關係的程序進行通訊。

2、與普通檔案一樣,只要建立,任何程序都可以進行讀與寫。

#include

#include

intmkfifo

(const

char

*pathname, mode_t mode)

;// return value

// on success mkfifo() returns 0.

// pathname: 建立fifo檔案的路徑

// mode: 檔案的許可權,同open()

開啟fifo檔案通常有四種方式:

open(const char *path, o_rdonly); // 唯讀

open(const char *path, o_rdonly | o_nonblock); // 唯讀,並且不阻塞

open(const char *path, o_wronly); // 只寫

open(const char *path, o_wronly | o_nonblock); // 只寫,並且不阻塞

mkfifo-write.c

#include

#include

#include

#include

#include

#include

#include

intmain()

}printf

("process %u open fifo o_wronly\n"

,getpid()

);int fifo_fd =

open

(fifo_name, o_wronly);if

(fifo_fd !=-1

)write

(fifo_fd,

"\n",1

);close

(fifo_fd);}

else

return0;

}

mkfifo-read.c

#include

#include

#include

#include

#include

#include

#include

intmain()

close

(fifo_fd);}

else

return0;

}

程序間通訊(ipc)介紹

程序間通訊 IPC 管道

管道是unix ipc最古老的形式,所有unix系統都提供此通訊機制。管道的兩種限制 1 半雙工,資料單方向流動。2只能用於具有公共祖先的程序之間。需要雙方通訊時,需要建立起兩個管道。例外 流管道沒有限制1,fifo和命名管道沒有限制2。管道是乙個檔案,但它不屬於某種檔案系統,而是 單獨構成一種檔案...

程序間通訊(IPC) 管道(Pipe)

管道 乙個程序連線資料流到另乙個程式 pipe函式的原型 include int pipe int file descriptor 2 該閃身在陣列中填上兩個新的檔案描述符後返回0,如果失敗則返回 1。寫到file descriptor 1 的所有資料都可以從file descriptor 0 讀回...

LINUX程序間通訊(IPC) 管道

管道,通常指無名管道,是unix系統ipc最古老的形式 1 include 標頭檔案 2 int fd 2 fd 0 讀端 fd 1 寫端 3 pipe fd 建立管道 4 傳輸資訊時,傳送端先關閉讀端fd 0 再進行寫操作 接收端反之,close fd 1 read include include...