Linux 程序間通訊 管道

2021-08-08 21:36:52 字數 1212 閱讀 2812

程序間通訊:

a程序怎樣將「hello world」傳遞給b程序:

i:利用檔案實現:需要乙個「中間人」進行傳遞 --- 檔案(在磁碟中儲存),a先呼叫open函式開啟檔案,再用write函式寫檔案,b用read函式讀取檔案,但問題如下:

1.如果a傳送了資料b進行了接收,但a的資料沒有被清空

2.如果a傳送了資料b接收了,但a並沒有在檔案中寫入資料,而b程序也沒有發生阻塞

3.讀取檔案使用i/o操作,耗費時間

所以,檔案不適合程序之間的互動。

ii:可用

在進行管道-訊號量-訊息佇列後,a程序傳送的檔案會自動清空,並且b程序讀取檔案時發現檔案為空時會發生阻塞,停止接收,直到檔案不為空 1.

管道 管道通訊原理:在記憶體上開闢乙個空間,a、b程序都通過檔案描述符操作這塊空間,以完成互動的功能(兩個程序不會有交集)

管道檔案:僅僅是目錄樹中的乙個表示,並不在磁碟中佔據空間。

1.1 有名管道

特性:有名字的管道,可以在任意兩個程序間傳遞資料

建立:mkfifo命令  和  mkfifo()函式  進行建立

使用:開啟 open(路徑+檔名,o_wronly)只寫開啟

寫資料  write(open的返回值,內容,長度)

讀取檔案  read(open的返回值,buff,長度127)

關閉  close(open的返回值)

特點:(1) 如果程序以只寫操作開啟管道,並且沒有以唯讀或者讀寫開啟這個管道的另乙個程序,則開啟操作會阻塞,直到有程序以唯讀或讀寫開啟這個管道,open才會返回。

(2) 如果程序以唯讀或者讀寫開啟管道,並且沒有以只寫操作開啟這個管道的另乙個程序,則開啟操作會阻塞,直到有程序以只寫開啟這個管道,open才會返回。

(3) 當寫端沒有寫入資料時,讀端會阻塞read呼叫,直到寫端寫入資料。

(4) 當管道沒有空間時,再寫入資料就會被阻塞,直到有程序讀取資料,或者所有讀端關閉(當完成資料交換時,a程序會自動清空資料)

1.2 無名管道

2. 訊號量

3. 訊息佇列

4. 共享記憶體

iii:擴充套件內容

1. 管道大小?怎樣修改管道大小?

練習:a程序接收使用者收入,b程序統計使用者輸入的字元個數,當使用者輸入end結束,並且end不計入字數。

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 程序間通訊 管道

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