程序間通訊之管道

2021-08-17 07:55:29 字數 3125 閱讀 4091

既然要介紹程序間通訊,首先來看看什麼是程序間通訊:

2. 程序間通訊的目的:

1)資料傳輸:乙個程序需要將它的資料傳送給另乙個人程序

2)資源共享:多個程序共享同樣的資源

3)通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知它(它們)發生了某種事件

4)程序控制:有些程序希望完全控制某些程序的執行,此時控制程序希望能夠攔截另乙個程序的所有陷入和異常,並能夠及時知道它的狀態改變

3. 程序間通訊分類:

1)管道

a. 匿名管道

b. 命名管道

2)system v ipc

a. system v 訊息佇列

b. system v 共享記憶體

c. system v 訊號量

3)posix ipc訊息佇列、共享記憶體、訊號量、條

件變數、讀寫鎖

知道了什麼是程序間通訊,下面開始介紹程序間通訊方式之一——管道

首先來看看什麼是管道:

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

前面我們已經知道管道分為匿名管道和命名管道,以下將對這兩種管道分別進行介紹:

1. 匿名管道

函式原型:

int pipe(int fd[2]);
引數

fd:檔案描述符陣列,其中fd[0]表示讀端,fd[1]表示寫端

返回值:成功返回0,失敗返回錯誤**

例:從鍵盤讀取資料,寫入管道,讀取管道,寫到螢幕:

#include #include #include #include int main(void)

while(fgets(buf,100,stdin))

memset(buf,0x00,sizeof(buf));

if((len=read(fds[0],buf,100))==-1)

if(write(1,buf,100)!=len)}}

測試結果:

上幾張圖再來理解一下管道:

(匿名)管道特點

1.只能用於具有共同祖先的程序,(具有親緣關係的程序)之間進行通訊,通常,乙個官道由乙個程序建立,然後該程序呼叫fork,此時父子程序之間就可應用該管道

2.管道提供流式服務(位元組流)

3.一般而言,程序退出,管道釋放,所以,管道的生命週期隨程序

4.一般而言,核心會對管道操作進行同步或互斥

互斥:同一時間乙份資源只能被乙個程序訪問

5.管道是半雙工的,資料只能向乙個方向流動,需要雙方通訊時,需建立起兩個管道

2.命名管道

1)管道應用的乙個限制就是只能在具有共同祖先(具有親緣關係)的程序間通訊

2)如果我們想在不相關的程序間交換資料,可以使用fifo檔案來做這項工作,它經常被稱為命名管道

3)命名管道是一種特殊型別的檔案

命名管道可以從命令上建立,命令列方法是使用下面這個命令:

$ 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

serverpipe.c

#include #include #include #include #include #include #define err_exit(m) \

dowhile(0)

int main()

int rfd=open("mypipe",o_rdonly);

if(rfd<0)

char buf[1024];

while(1)

else if(s==0)

else

}close(rfd);

return 0;

}

clientpipe.c

#include #include #include #include #include #include #include #define err_exit(m) \

dowhile(0)

int main()

char buf[1024];

while(1)

else if(s<=0)

}close(wfd);

return 0;

}

測試結果:

最後來看一下匿名管道與命名管道的區別:

1)匿名管道由pipe函式建立並開啟

2)命名管道由mkfifo函式建立,開啟用open

3)fifo(命名管道)與pipe(匿名管道)之間唯一的區別在它們建立與開啟的方式不同,一旦這些工作完成之後,它們具有相同的語義

程序間通訊 之 管道

一 無名管道 特點 具有親緣關係的程序間通訊,但不僅僅指父子程序之間哦。1 無名管道的建立 int pipe int pipefd 引數 pipefd 陣列的首位址 返回值 成功返回0,失敗返回 1 注意 無名管道存在核心空間,建立成功會給使用者空間兩個檔案描述符,fd 0 讀管道 fd 1 寫管道...

程序間通訊之管道

我們將乙個程序到另乙個程序的資料流稱為管道,它是程序間通訊最古老的方式。管道分為兩種 匿名管道與命名管道。匿名管道 顧名思義,所謂的匿名管道自然就是沒有名字的管道,這種管道通常用於有親緣關係的程序間的通訊。匿名管道通常由pipe函式來建立,當乙個程序建立了乙個匿名管道後,它們的模型就是這樣的 可以看...

程序間通訊之管道

程序間通訊的本質就是讓兩個毫不相干的程序去看到同乙份資源 作業系統所提供的 一 管道的定義 管道是比較古老的程序間通訊的形式,把從乙個程序連線到另乙個程序的乙個資料流稱為乙個 管道 二 管道的兩種方式 1 匿名管道 匿名管道是一種最基礎的ipc機制,由pipe函式建立 include int pip...