既然要介紹程序間通訊,首先來看看什麼是程序間通訊:
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...