Linux程序間通訊 管道

2021-06-01 20:00:46 字數 3557 閱讀 1485

linux程序間通訊機制:

1.同一主機程序間通訊機制:

unix方式:有名管道fifo、無名管道pipe、訊號signal

systemv方式:訊號量、訊息佇列、共享記憶體

2.網路通訊:rpc(remote procedure call)、socket

管道管道是程序間通訊中最古老的方式,它包括無名管道和有名管道兩種,前者可用於具有親緣關係程序間的通訊,即可用於父程序和子程序間的通訊,後者額克服了管道沒有名字的限制,因此,除具有前者所具有的功能外,它還允許無親緣關係程序間的通訊,即可用於執行於同一臺機器上的任意兩個程序間的通訊。

無名管道由pipe()函式建立:

#i nclude

int pipe(int filedis[2]);

引數filedis返回兩個檔案描述符:filedes[0]為讀而開啟,filedes[1]為寫而開啟。filedes[1]的輸出是filedes[0]的輸入。 無名管道占用兩個檔案描述符,  不能被非血緣關係的程序所共享,  一般應用在父子程序中. 

特點:

半雙工單向、父子程序間、一端寫一段讀、沒有名字、緩衝區有限、資料無格式

無名管道常用於父子程序中,  可簡單分為單向管道流模型和雙向管道流模型.  其中,  單向管道流根據流向分為從父程序流向子程序的管道和從子程序流向父程序的管道. 

下面設計乙個例項,  資料從父程序流向子程序:父程序向管道寫入一行字元,  子程序讀取資料並列印到

螢幕上. 

[bill@billstone unix_study]$ cat pipe1.c 

#include

#include

#include

#include

int main() 

int fildes[2]; 

pid_t pid; 

int i,j; 

char buf[256]; 

assert(pipe(fildes) == 0);                          //  建立管道 

assert((pid = fork()) >= 0);                      //  建立子程序 

if(pid == 0) 

c** 

/*fifoclient.c:從fifo中讀出資料*/

#include

#include

#include

#include

#define fifo_server "fifo4"

main(int argc,char** argv)  

printf("%d\n",fd);  

while(1)  

unlink(fifo_server);  

}  下面是乙個簡單的例項. 

首先是寫程序:  建立 fifo 檔案,  再開啟寫埠,  然後讀取標準輸入並將輸入資訊傳送到管道中,  當鍵

盤輸入'exit'或'quit'時程式退出. 

[bill@billstone unix_study]$ cat fifo1.c 

#include

#include

#include

#include

#include

extern int errno; 

int main() 

file *fp; 

char buf[255]; 

assert((mkfifo("myfifo", s_ififo|0666) > 0) || (errno == eexist)); 

while(1){ 

assert((fp = fopen("myfifo", "w")) != null); 

printf("please input: "); 

fgets(buf, sizeof(buf), stdin); 

fputs(buf, fp); 

fclose(fp); 

if(strncmp(buf, "quit", 4) == 0 || strncmp(buf, "exit", 4) == 0) 

break; 

return 0; 

[bill@billstone unix_study]$ make fifo1 

cc          fifo1.c      -o fifo1 

[bill@billstone unix_study]$   

然後是讀程序:  開啟管道的讀埠,  從管道中讀取資訊(以行為單位),  並將此資訊列印到螢幕上.  當讀

取到'exit'或者'quit'時程式退出. 

[bill@billstone unix_study]$ cat fifo2.c 

#include

#include

#include

#include

int main() 

file *fp; 

char buf[255]; 

while(1){ 

assert((fp = fopen("myfifo", "r")) != null); 

fgets(buf, strlen(buf), fp); 

printf("gets: [%s]", buf); 

fclose(fp); 

if(strncmp(buf, "quit", 4) == 0 || strncmp(buf, "exit", 4) == 0) 

break; 

return 0; 

[bill@billstone unix_study]$ make fifo2 

cc          fifo2.c      -o fifo2 

[bill@billstone unix_study]$   

在乙個終端上執行 fifo1,  而在另乙個終端上執行 fifo2. 

我們先輸入'hello', 'world',  然後再輸入'exit'退出: 

[bill@billstone unix_study]$ ./fifo1 

please input: hello 

please input: world 

please input: exit 

[bill@billstone unix_study]$   

我們可以看到讀出結果如下: 

[bill@billstone unix_study]$ ./fifo2 

gets: [hello 

]gets: [world]gets: [exit][bill@billstone unix_study]$ 

看到上面的輸出結果,  您可能認為是我寫錯了.  其實不是的,  讀出結果正是如此,  其實按照我們的本意,

正確的輸出結果應該是這樣的: 

[bill@billstone unix_study]$ ./fifo2 

gets: [hello 

]gets: [world 

]gets: [exit

Linux程序間通訊 管道

管道 管道是一種最基本的程序間通訊機制,由pipe函式建立 include intpipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的讀端,f...

Linux 程序間通訊 管道

程序間通訊 a程序怎樣將 hello world 傳遞給b程序 i 利用檔案實現 需要乙個 中間人 進行傳遞 檔案 在磁碟中儲存 a先呼叫open函式開啟檔案,再用write函式寫檔案,b用read函式讀取檔案,但問題如下 1.如果a傳送了資料b進行了接收,但a的資料沒有被清空 2.如果a傳送了資料...

LInux 程序間通訊 管道

管道是unix中一種程序間通訊的方法,我們把從乙個程序鏈結到另外乙個程序的資料流稱為 管道 管道是最像佇列的一種程序間通訊模型,生產者的程序在管道的寫端寫入資料,消費者的程序在管道的讀端進行讀取資料,這個過程類似於佇列,區別就是我們並不需要關心使用的管道的執行緒安全和記憶體分配等瑣碎的事情,這些事情...