程序間通訊之管道

2021-08-17 22:32:56 字數 2543 閱讀 6393

程序間通訊的本質就是讓兩個毫不相干的程序去看到同乙份資源(作業系統所提供的)

一、管道的定義

管道是比較古老的程序間通訊的形式,把從乙個程序連線到另乙個程序的乙個資料流稱為乙個「管道」。

二、管道的兩種方式

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 程序控制 有些程序希望完全控制某些程序的執行,...