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.資料被程序讀出,將從管道中刪除 二 管...