程序間通訊方式介紹 管道

2021-06-17 22:00:32 字數 2351 閱讀 4003

1.程序間通訊的方式:

(1)管道:一種兩個程序間進行單向通訊的機制,半雙工的通訊方式。資料只能單方向流動,而且只能在具有親緣關係(父子程序、兄弟程序)的程序間使用。

從通訊的雙方資訊互動的方式分三種基本模式:

單工通訊(單向通訊) 只有乙個方向的通訊而沒有反方向的互動(資訊流是單方向的),傳送端和接收端的身份是固定的;

半雙工通訊(雙向交替通訊)雙方均可以傳送、接收資訊,但是同一時刻裡,資訊只能有乙個傳輸方向;

全雙工通訊(雙向同時通訊) 雙方可以同時傳送和接收資訊。

(2)有名管道:(fifo)半雙工的通訊方式,克服了只能有親緣關係的程序通訊的限制。

(3)訊號量;4)訊息佇列;(5)訊號(chapter 9);(6)共享記憶體;7)套接字。

2.管道的概念

管道:兩個程序間進行單向通訊的機制(半雙工管道)

侷限性:由於管道傳遞資料的單向性,決定其使用的侷限性:資料的單向流動;有親緣關係的程序間的通訊;沒有名字;緩衝區大小受限制(傳送的是無格式的位元組流)

管道就是乙個存在於記憶體的特殊檔案,程序就是通過讀寫該檔案進行通訊的(記憶體中的某個頁面作為資料緩衝區)

如果要建立兩個程序的資料通路,首先父程序應呼叫pipe建立管道,接著呼叫fork,由於子程序自動繼承父程序的資料段,便可實現父子程序同時擁有管道的操作權,如下圖(a),但為了維護管道,比如想要乙個父程序到子程序的資料通道時,在父程序中關閉讀出端,子程序中關閉管道的寫入端,圖(b)。

(b) 通過管道進行的父/子程序通訊(半雙工通訊)

#include

#include

#include

#include

#include

//讀管道

void read_from_pipe(int fd)

//寫管道

void write_to_pipe(int fd)

int main(void)

pid =fork();

switch(pid)

return0;

}//建立兩個管道來實現全雙工通訊

#include

#include

#include

#include

#include

void child_rw_pipe(int rfd,int wfd)

void parent_rw_pipe(int rfd,int wfd)

int main(void)

//管道2實現子程序寫,父程序讀

if(pipe(fd2))

pid =fork();

switch(pid) }

通過管道模擬shell命令:

cat file|sort

通過乙個管道,將」cat file」的結果通過管道送給命令」sort」。需要用dup()或者dup2()系統呼叫將標準輸入和標準輸出聯絡起來,這裡的」catfile」和」sort」命令不是自己來完成,而是通過呼叫exec函式族來實現的。

#include

#include

#include

#include

#include

#include

int main(void)

pid =fork();

switch(pid)

{ case-1:

perror("create process failed!\n");

exit(1);

case0:

dup2(0,fd[0]); 

//關閉標準輸入,從管道讀取內容

close(fd[1]); 

//子程序關閉管道的寫端

printf("i amchild program!\n");

if(execlp("sort","sort",null))

perror("execlp error!\n");

exit(0);

default:

dup2(1,fd[1]); 

//關閉標準輸出,將要寫到標準輸出的內容寫入管道

close(fd[0]); 

//父程序關閉管道的讀端

printf("thisis  parent process!\n");

if(execlp("cat","cat","a.txt",null))

perror("execlp error!\n");

wait(&stat_val);

程序間通訊方式 管道通訊

c語言中的管道通訊是通過在核心中開闢一塊空間,使用者通過檔案io介面來訪問這塊空空間實現通訊目的。管道的優點是直接訪問記憶體,通訊速度較快。缺點是一方面管道屬於半雙工的通訊,即同一程序只能讀或者寫,無法同時讀寫同一管道。另一方面管道中的資料只能讀一次,無法重複讀取。程序通過檔案io來操作管道,但是不...

程序間通訊方式 管道

1.管道的建立 管道是由呼叫pipe函式來建立 include int pipe int fd 2 返回 成功返回0,出錯返回 1 是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係 父子程序 的程序間使用。2.有名管道和無名管道的區別 有名管道 可以在任意兩個程序之間,有名的名字存在...

程序間的通訊方式之管道通訊

一 管道通訊的特點 1.管道是單向的,先進先出的。2.乙個程序在管道尾部寫入資料,另乙個程序在管道頭部讀取資料。因此管道通訊是半雙工的。3.管道提供了簡單的流控制機制,當程序試圖讀空管道時,程序將阻塞。當管道已經寫滿時,程序再試圖向管道寫入資料,程序將阻塞。4.資料被程序讀出,將從管道中刪除 二 管...