程序間通訊IPC

2021-03-31 12:44:29 字數 2791 閱讀 4049

這兩天學習了

unix

的程序間通訊

ipc,這裡面有幾個很重要的基本概念,特別是訊息佇列和我的畢設很有關係,因此多說幾句。

以前學習的程序間通訊方式,一般都是經由

fork

或exec

開啟檔案,或經過檔案系統。而

ipc是程序間通訊方式的統稱。下面一一道來。 一.

管道

管道是最老的

ipc形式。管道有兩種限制;

(1)

它們是半雙工的。資料只能在乙個方向上流動。

(2)

它們只能在具有公共祖先的程序之間使用。通常,乙個管道由乙個程序建立,然後該程序呼叫

fork

,此後父、子程序之間就可應用該管道。

對管道描述符可以呼叫

read

和write

。更為有益的是將管道描述符複製為標準輸入和標準輸出。在此之後通常子程序呼叫

exec

,執行另乙個程式,該程式從標準輸入(已建立的管道)或將資料寫至其標準輸出(管道)。這樣就可以建立一些自動執行的程式,如自動完成從檔案輸入,從標準輸出上列印。

乙個特殊應用:當同乙個程式產生某個過濾程式的輸入,同時又讀取該過濾程式的輸出時,則該過濾程式就成為協同程序。

二.

fifo

命名管道

管道只能由相關程序使用,它們共同的祖先程序建立了管道。但是通過

fifo

,不相關的程序也能交換資料。

fifo

是一種檔案型別。建立

fifo

類似於建立檔案,也就像使用檔案一樣使用它。

fifo

有兩種用途:

(1) fifo

由shell

命令使用以便將資料從一條管道線傳送到另一條,為此無需建立中間臨時檔案。

(2) fifo

用於客戶機

-伺服器應用程式中,以在客戶機和伺服器之間傳遞資料。

三.

訊號量

訊號量是乙個計數器,用於多程序對共享資料物件的訪問。為了正確地實現資訊量,訊號量值的測試及減

1操作應當是原子操作。為此,訊號量通常是在核心中實現的。

關於訊號量的介紹很多,這裡就不多講了。

四.共享儲存

共享儲存允許兩個或多個程序共享一給定的儲存區,是最快的一種

ipc。最重要的是保證對給定儲存區的同步訪問。通常,訊號量(記錄鎖也可)被用來實現對共享儲存訪問的同步。

五.訊息佇列

訊息佇列是訊息的鏈結表

,存放在核心中並由訊息佇列識別符號標識。

具體對訊息佇列的訪問就不多講了,這裡特別談談從

unix

對訊息佇列的實現中學到的一點技巧。

若我們在訊息的結構中加入乙個域

type

(unix

中已經存在),則可以利用它實現很多功能。例如:

type

表示訊息的型別,那麼我們在接收訊息時,可以指定接收某種

type

的訊息;又或者設定

type

為訊息的優先權值,就可以根據優先權接收訊息,等等。這樣,我們就可以不按照

fifo

的順序來實現訊息佇列。 cs

模式下使用訊息佇列則存在多種可能性:

(1)

在伺服器和客戶機之間可以只使用乙個佇列,使用每個訊息的

type

字段指明誰是訊息的接受者。例如,客戶機可以用型別欄位為

1傳送它們的訊息。在要求之中應包括客戶機的程序

id。此後,伺服器在傳送響應訊息時,將型別字段設定為客戶機的程序

id。伺服器只接受型別欄位為

1的訊息,客戶機則只接受型別字段等於它們的程序

id的訊息。

(2)

另一種方法是每個客戶機使用乙個單獨的訊息佇列。在向伺服器傳送第乙個請求之前,每個客戶機先建立它自己的訊息佇列。伺服器也有它自己的佇列,其識別符號是所有客戶機知道的。客戶機將其第乙個請求送到伺服器的眾所周知的佇列上,該請求中應包含其客戶機訊息佇列的佇列

id。伺服器將其第乙個響應送至客戶機佇列,此後的所有請求和響應都在此佇列上交換。使用這種技術的乙個問題是:每個客戶機專用佇列通常只有乙個訊息在其中(或者是對伺服器的乙個請求,或者是對客戶機的響應)。這似乎是對有限的系統資源(訊息佇列)的浪費,可以用乙個

fifo

來代替。

這種型別的客戶機

-伺服器關係(客戶機和伺服器是無關係程序)的重點和難點是:伺服器如何準確地標識客戶機,以便準確響應。

不過對於我的畢設,似乎和這個訊息傳遞的方向相反。根據

gui的特徵,伺服器接收外部的訊息,然後根據一定的條件判定以後,分發對正確的客戶進行處理。客戶處理完畢,似乎不是必須反饋處理結果給伺服器。那麼所謂的「一定的條件」是什麼呢?當前具有焦點的物件?那麼客戶與客戶之間的訊息傳遞又是怎麼樣的?根據什麼來標識?是直接從客戶

1到客戶

2,還是所有訊息都由伺服器來**?在

gui中,訊息佇列的數量又該是多少?

最關鍵的還是我趕緊想清楚多工的

gui到底是一種什麼樣的實現?

初步的想法是: 1.

乙個伺服器任務,每個視窗又都是乙個任務,只有乙個訊息佇列,由伺服器來維護,每個視窗只需要實現自己的視窗過程處理訊息即可。那麼訊息佇列在

gui系統中就是全域性的了。這好像就是

windows

的實現方式。但這時,我怎麼建立這麼多的視窗任務? 2.

乙個伺服器任務,負責主訊息佇列,每個視窗也是乙個任務,但有自己的訊息佇列,由自己維護。這個實現更複雜,就像是乙個多執行緒版本。

這兩種的區別在**?能夠實現我的功能嗎?

程序間通訊 IPC

part2 index1.html part2 index2.html linux至少支援如下ipc機制 同時支援posix和system v方式 streams ipc機制,linux本身不支援,有乙個單獨的安裝包 可以跨pc的程序通訊 互斥鎖或條件變數 動態初始化 不能使靜態分配 在共享記憶體中...

程序間通訊IPC

乙個大型的應用系統,往往需要眾多程序協作,程序間通訊的重要性顯而易見。首先,程序間通訊至少可以通過傳送開啟檔案來實現,不同的程序通過乙個或多個檔案來傳遞資訊,事實上,在很多應用系統裡,都使用了這種方法。但一般說來,程序間通訊 ipc interprocess communication 不包括這種似...

程序間通訊IPC

關係程序的程序間通訊 父子關係 沒有關係的程序通過訊號進行通訊 管道比共享記憶體的實時性好 linux下預設遵守posix的程序間通訊匿名管道 管道pipe 命名管道 fifo 套接字 高階ipc 不同主機間通訊 管道通訊最常見的ipc方式 int pipe int fd 2 返回 成功為0 失敗為...