同時處理多個業務模組,多個業務模組可能需要相互傳遞資料,也可能需要同步控制。
兩個實體需要互動通訊,必須有能夠共享的資源。
磁碟上的檔案:——>io處理,速度慢,且存在不同步的問題。
管道命名管道——>在磁碟上有乙個管道檔案的標識
,傳遞資料就是在記憶體中儲存,並不會儲存到磁碟空間。
無名管道——>父子程序共享fork之前開啟的檔案描述符
訊號量共享記憶體
訊息佇列
——————————2,3,4均借助系統的核心空間,核心物件socket網路程式設計
建立
管道檔案:
①命令:
mkfifo name
②系統呼叫:
int mkfifo(const
char
*filename,int mode);
管道檔案的操作
:
open read write close
前三者都會阻塞執行:
open會阻塞,必須成對出現;
read會阻塞,寫進去才能讀取;
write也會阻塞,即當記憶體空間不足時,管道的記憶體空間耗盡;
開啟
管道檔案:由於管道的半雙工特性,flag只能是o_rdonly
和o_wronly
int
open
(cosnt char
*path,
int flag)
原理:管道是由核心管理的乙個緩衝區,相當於我們放入記憶體中的乙個紙條。管道的一端連線乙個程序的輸出。這個程序會向管道中放入資訊。管道的另一端連線乙個程序的輸入,這個程序取出被放入管道的資訊。乙個緩衝區不需要很大,它被設計成為環形的資料結構,以便管道可以被迴圈利用。當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入資訊。當管道被放滿資訊的時候,嘗試放入資訊的程序會等待,直到另一端的程序取出資訊。當兩個程序都終結的時候,管道也自動消失。
由上圖可知,緩衝區只有乙份,管道是一種半雙工的通訊方式
練習:a程序接受使用者輸入的資料,b程序將使用者輸入的字串全部轉化為大寫並輸出,迴圈執行,使用者輸入end結束。
a.c
#include
#include
#include
#include
intmain()
;fgets
(buff,
127,
stdin);
if(strncmp
(buff,
"end",3
)==0)
write
(fd,buff,
strlen
(buff)-1
);}close
(fd)
;exit(0);}
b.c
#include
#include
#include
#include
intmain()
;int n =
read
(fd,buff,
127);if
(n ==0)
printf
("buff::%s\n"
,buff);}
close
(fd)
;exit(0);}
只能應用在有關係的程序之間,也是一種半雙工的通訊方式
無名管道的建立及開啟:
int
pipe
(int fds[
2]
成功返回0,失敗返回-1
因此pipe不會阻塞,讀端寫端同時出現。
大致框架如下:
int fds[2]
;pipe
(fds)
; ——>不會阻塞,直接建立並開啟無名管道:讀寫端都有;
這一句一定要寫在fork之前,fork後,子程序才能繼承父程序開啟的檔案描述符
pid =
fork()
; ——>產生4個檔案描述符,因此close先關閉一對讀寫,然後read,write
if(pid ==0)
else
和有名管道的一些區別:有名管道:能夠應用在任意兩個有許可權操作管道檔案的程序之間。
無名管道:只能應用在有關係的兩個程序之間。
無名管道實現:
練習:a程序接受使用者輸入的資料,b程序將使用者輸入的字串全部轉化為大寫並輸出,迴圈執行,使用者輸入end結束。
#include
#include
#include
#include
#include
intmain()
;int n =
read
(fds[0]
,buff,
127)
;//從無名管道的讀端fds[0]中讀取資料
if(n <=0)
printf
("child::%s\n"
,buff);}
close
(fds[0]
);}else
;fgets
(buff,
127,
stdin);
if(strncmp
(buff,
"end",3
)==0)
write
(fds[1]
,buff,
strlen
(buff)-1
);//將buff中的資料通過fds[1]寫入無名管道中
}close
(fds[1]
);}exit(0);}
這段**存在的問題就是:子程序沒有讀取資料,父程序卻繼續執行了,導致終端顯示出現了問題。這個問題的解決,需要用非同步io解決。 Linux程序間通訊 管道
linux程序間通訊機制 1.同一主機程序間通訊機制 unix方式 有名管道fifo 無名管道pipe 訊號signal systemv方式 訊號量 訊息佇列 共享記憶體 2.網路通訊 rpc remote procedure call socket 管道管道是程序間通訊中最古老的方式,它包括無名管...
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傳送了資料...