Linux 程序間通訊(管道)

2021-10-10 11:14:28 字數 3364 閱讀 2628

同時處理多個業務模組,多個業務模組可能需要相互傳遞資料,也可能需要同步控制。

兩個實體需要互動通訊,必須有能夠共享的資源。

磁碟上的檔案:——>io處理,速度慢,且存在不同步的問題。

管道命名管道——>在磁碟上有乙個管道檔案的標識,傳遞資料就是在記憶體中儲存,並不會儲存到磁碟空間。

無名管道——>父子程序共享fork之前開啟的檔案描述符

訊號量共享記憶體

訊息佇列

——————————2,3,4均借助系統的核心空間,核心物件socket網路程式設計

建立管道檔案:

①命令:

mkfifo name
②系統呼叫:

int mkfifo(const

char

*filename,int mode);

管道檔案的操作

open read write close
前三者都會阻塞執行:

open會阻塞,必須成對出現;

read會阻塞,寫進去才能讀取;

write也會阻塞,即當記憶體空間不足時,管道的記憶體空間耗盡;

開啟管道檔案:由於管道的半雙工特性,flag只能是o_rdonlyo_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傳送了資料...