程序間通訊之 IPC

2021-07-25 04:04:55 字數 2568 閱讀 4056

有三種稱做xsi ipc的ipc:訊息佇列(message queues)、訊號量(semaphores)、以及共享記憶體(shared memory)。
每個核心中的ipc結構(訊息佇列, 訊號量和共享儲存段)都用乙個非負整數的識別符號來加以引用。要向乙個佇列中傳送訊息或讀取訊息只需要知道其佇列識別符號即可。

該識別符號與檔案描述符不同的是, 建立時並不會重複利用通過刪除**的整數, 而是每次+1, 直到整數最大值迴轉到0。

識別符號是ipc物件的內部名, 而它的外部名則是key(鍵),。

無論何時建立ipc結構(通過呼叫msgget、semget、shmget),都應該指定乙個key,key的基本型別是key_t, 在標頭檔案中定義,key由核心變換成identifier。

(1) 伺服器程序可以指定鍵ipc_private建立乙個新的ipc結構,將返回的識別符號存放在某處(如乙個檔案)以便和客戶程序取用。

缺陷:需要服務程序將識別符號(identifier)寫到檔案中,客戶程序使用時候還需要讀取檔案。

(2) 在乙個公用標頭檔案 中定義 乙個客戶程序和伺服器程序都認可的鍵。然後伺服器程序指定此鍵建立乙個新的ipc結構。

下面**以訊息隊列為例說明。

#define msgkey 1024 

msqid=msgget(msgkey,ipc_excl);

缺陷:巨集定義的鍵值,可能已經有乙個ipc結構與其結合,從而導致建立失敗。

(3) 客戶程序和伺服器程序認同乙個路徑和專案id(專案id是0~255間的字元值),接著呼叫函式ftok將這兩個值變換乙個鍵。然後在方法(2)中使用此鍵。

#inlcude 

key_t ftok(const

char *path, int projid);

path 引數必須引用乙個現存盤案,如果想填寫當前目錄則用」.」。在一般的unix實現中,是將檔案的索引節點號取出,再加上projid得到對應的key值。

缺陷:檔案的索引節點號使用long long儲存的,而key是int結構,因此在計算過程中存在對檔案索引節點號進行擷取的可能,不同路徑的檔案同樣可能產生相同的key。

xsi ipc為每乙個ipc結構關聯了乙個ipc_perm結構,perm是 permission的簡寫。

struct ipc_perm

;/* 這裡只是舉例,核心中該結構成員也是在發生變化的,但是基本的元素一直保持不變,該結構體一般是其他ipc結構的第乙個成員,例如訊息佇列的ipc結構宣告為 */

struct msqid_ds

在建立ipc結構時,對所有欄位都賦初值。以後,可以呼叫msgctl、semctl或shmctl修改uid、gid和mode欄位。

改變這些值,呼叫程序必須是ipc結構的建立者或超級使用者。

系統進行程序間通訊(ipc)的時候,可用的方式包括訊號量、共享記憶體、訊息佇列、管道、訊號(signal)、套接字等形式。使用ipcs可以在linux系統下檢視共享記憶體、訊號量、訊息佇列的狀態。

各引數如下 :

-m shared memory segments

-q message queues

-s semaphore arrays

-a all (this is the default)

下面列出訊息佇列常用的命令

注:環境中沒有訊息存在,所以示例只顯示了命令執行時每一列的條目

- 列表內容

ipcs -q : 顯示所有的訊息佇列

—— message queues ——– 

key msqid owner perms used-bytes messages

ipcs -qt : 顯示訊息佇列的建立時間,傳送和接收最後一條訊息的時間

—— message queues send/recv/change times ——– 

msqid owner send recv change

ipcs -qp: 顯示往訊息佇列中放訊息和從訊息佇列中取訊息的程序id

—— message

queues

pids ——–

msqid owner lspid lrpid

其中lspid含義是最後乙個send程序,lrpid含義是最後乙個receive程序

ipcs -q -i msgid: 顯示msgid對應的訊息佇列結構體中的資訊

ipcs -ql : 顯示訊息佇列的限制資訊

—— messages: limits ——– 

max queues system wide = 31868

max size of message (bytes) = 65536

default max size of queue (bytes) = 65536

程序間通訊IPC

這兩天學習了 unix 的程序間通訊 ipc,這裡面有幾個很重要的基本概念,特別是訊息佇列和我的畢設很有關係,因此多說幾句。以前學習的程序間通訊方式,一般都是經由 fork 或exec 開啟檔案,或經過檔案系統。而 ipc是程序間通訊方式的統稱。下面一一道來。一 管道 管道是最老的 ipc形式。管道...

程序間通訊 IPC

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

程序間通訊IPC

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