程序間通訊的本質就是讓兩個毫不相干的程序去看到同乙份資源(作業系統所提供的)一、管道的定義
管道是比較古老的程序間通訊的形式,把從乙個程序連線到另乙個程序的乙個資料流稱為乙個「管道」。
二、管道的兩種方式
1、匿名管道
匿名管道是一種最基礎的ipc機制,由pipe函式建立
#include
int pipe(int fd[2]);
// 引數含義:fd為檔案描述符陣列,其中fd[0]表示讀端,fd[1]表示寫端
// 返回值:pipe函式成功返回0,失敗返回錯誤碼
匿名管道的特點:
* (1)管道在進行程序間通訊必須在親緣關係或父子關係間進行管道通訊
* (2)管道只能進行單向資料通訊
* (3)管道程序間通訊是基於位元組流的
* (4)管道的生命週期隨程序
* (5)管道是自帶同步機制的
實現機制(站在檔案描述符角度)
(1)父程序建立管道(pipe)
(2)父程序fork出子程序(子程序和父程序的檔案描述符表相同,所以父子程序才可以在匿名管道中進行通訊)
(3)父程序關閉fd[0],子程序關閉fd[1]
為什麼要關閉部分的檔案描述符?
答:這樣是為了起到乙個預防的作用,管道是單方面進行通訊的。如果不關閉管道,父子程序也是可以進行通訊的。
管道的使用和檔案一致,所以看待管道就如同看待檔案一樣管道實現中有關讀寫的情況
* (1)父程序不讀且不關閉讀端,則子程序寫滿管道後會自行阻塞等待直至父程序來讀取
* (2)子程序不寫且不關閉寫端,則父程序不讀會阻塞等待直至子程序來寫
* (3)父程序不讀且關閉了讀端,則作業系統會關閉正在寫的子程序
* (4)子程序不寫且關閉了寫端,則父程序相當於讀了乙個檔案,當檔案讀完則對出,返回0值
2、命名管道(fifo)
命名管道是一種特殊型別的檔案,它可以使兩個不相干的程序實現彼此之間的通訊。
// 從命令列上建立
$ mkfifo filename
// 從程式裡建立
int mkfifo(const
char *filename, mode_t mode);
建立命名管道
int main(int argc, char *argv)
**實現:用命名管道實現server&client通訊
makefile
.phony:all
all : server
client
server : server.c
gcc - o $@ $ ^
client:client.c
gcc - o $@ $ ^
.phony:clean
clean :
rm - f server
client
server.c
#include
#include
#include
#include
int main()
int fd = open("./fifo", o_ronly);
if (fd<0)
char buf[1024];
while (1)
else
if (s == 0)
else
}close(fd);
return
0; }
client.c
#include
#include
#include
#include
#include
int main()
char buf[1024];
while (1)
close(fd);
return
0;}
3、匿名管道和命名管道的區別
* (1)匿名管道由pipe函式建立開啟
* (2)命名函式由mkfifo函式建立,開啟用open
* (3)fifo(命名管道)與pipe(匿名管道)之間唯一的區別在他們建立於開啟的方式不同,一旦這些工作完成之後,他們具有相同的語義
程序間通訊 之 管道
一 無名管道 特點 具有親緣關係的程序間通訊,但不僅僅指父子程序之間哦。1 無名管道的建立 int pipe int pipefd 引數 pipefd 陣列的首位址 返回值 成功返回0,失敗返回 1 注意 無名管道存在核心空間,建立成功會給使用者空間兩個檔案描述符,fd 0 讀管道 fd 1 寫管道...
程序間通訊之管道
我們將乙個程序到另乙個程序的資料流稱為管道,它是程序間通訊最古老的方式。管道分為兩種 匿名管道與命名管道。匿名管道 顧名思義,所謂的匿名管道自然就是沒有名字的管道,這種管道通常用於有親緣關係的程序間的通訊。匿名管道通常由pipe函式來建立,當乙個程序建立了乙個匿名管道後,它們的模型就是這樣的 可以看...
程序間通訊之管道
既然要介紹程序間通訊,首先來看看什麼是程序間通訊 2.程序間通訊的目的 1 資料傳輸 乙個程序需要將它的資料傳送給另乙個人程序 2 資源共享 多個程序共享同樣的資源 3 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它 它們 發生了某種事件 4 程序控制 有些程序希望完全控制某些程序的執行,...