我們將乙個程序到另乙個程序的資料流稱為管道,它是程序間通訊最古老的方式。
管道分為兩種:匿名管道與命名管道。
匿名管道
顧名思義,所謂的匿名管道自然就是沒有名字的管道,這種管道通常用於有親緣關係的程序間的通訊。匿名管道通常由pipe函式來建立,當乙個程序建立了乙個匿名管道後,它們的模型就是這樣的:
可以看出,僅連線了乙個程序的管道於這個程序而言是無意義的,所以通常還會在建立管道後呼叫fork函式建立子程序。當建立子程序後,就有了這樣的模型:
當需要在兩個程序間進行資料的傳輸時,可以在兩個程序中關閉相應的讀端或者寫端,就可以進行通訊了,從這種建立方式也可以看出匿名管道只能用於有親緣關係的程序間的通訊的原因了。
來看看匿名管道的特點:
1、僅能在有親緣關係的程序間進行通訊。
2、管道形式的程序間通訊是基於位元組流的。
3、管道是由程序建立的,因此當程序退出時管道也隨之釋放。
4、因為兩個程序對同乙個管道檔案進行操作,因此同一時間僅有乙個程序能訪問管道,並且兩個程序只能交替進行訪問,而不能出現乙個程序暫停而另乙個程序無限制訪問的情況,因此管道自帶同步機制。
5、管道是半雙工的,如果要實現兩個程序的雙向通訊,可以建立兩個管道。
如下**利用匿名管道實現兩個具有親緣關係的程序間的通訊:
#include
#include
#include
#include
int main()
pid_t id;
id = fork();
if(id == -1)
else
if(id == 0)
close(fds[1]);
exit(exit_success);
}else
;while(1)
else
printf("%s\n", buf);
}close(fds[0]);
exit(exit_success);
}return
0;}
命名管道顯然,命名管道就是有名字的管道,我們在程式中可以中函式mkfifo函式建立,匿名管道只能在具有親緣關係的程序間通訊,那麼命名管道就是在無親緣關係的程序間進行資料交流的通訊方式了。
利用命名管道進行程序間通訊的方式是在乙個程序中建立管道檔案,並對其以讀或者寫的方式開啟,同時在另乙個程序中以寫或者讀的方式開啟這個檔案,這樣就建立了兩個程序間的連線。
如下是利用命名管道在兩個程序間進行資料傳輸的程式:
server.c:
#include
#include
#include
#include
#include
#include
#define err_exit(m) \
dowhile(0);
int main()
; int len;
while(1)
else
}close(rfd);
return
0;}
client.c:
#include
#include
#include
#include
#include
#include
#define err_exit(m) \
dowhile(0);
int main()
; int len;
while(1)
else
}close(wfd);
return
0;}
makefile:
.phony : all
all : server
client
server : server.c
gcc server.c -o server
client : client.c
gcc client.c -o client
.phony : clean
clean :
rm -f server
client
程序間通訊 之 管道
一 無名管道 特點 具有親緣關係的程序間通訊,但不僅僅指父子程序之間哦。1 無名管道的建立 int pipe int pipefd 引數 pipefd 陣列的首位址 返回值 成功返回0,失敗返回 1 注意 無名管道存在核心空間,建立成功會給使用者空間兩個檔案描述符,fd 0 讀管道 fd 1 寫管道...
程序間通訊之管道
既然要介紹程序間通訊,首先來看看什麼是程序間通訊 2.程序間通訊的目的 1 資料傳輸 乙個程序需要將它的資料傳送給另乙個人程序 2 資源共享 多個程序共享同樣的資源 3 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它 它們 發生了某種事件 4 程序控制 有些程序希望完全控制某些程序的執行,...
程序間通訊之管道
程序間通訊的本質就是讓兩個毫不相干的程序去看到同乙份資源 作業系統所提供的 一 管道的定義 管道是比較古老的程序間通訊的形式,把從乙個程序連線到另乙個程序的乙個資料流稱為乙個 管道 二 管道的兩種方式 1 匿名管道 匿名管道是一種最基礎的ipc機制,由pipe函式建立 include int pip...