這兩天學習了
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 失敗為...