程序間通訊機制詳解( ) 訊息佇列

2021-10-23 00:19:50 字數 2944 閱讀 7098

訊息佇列本質上是位於核心空間的鍊錶,鍊錶的每個節點都是一條訊息。訊息佇列存放在核心中並由佇列識別符號標識。

訊息資料格式

無論傳送還是接收訊息,訊息的格式都必須按照規範來。

數字 1 表示型別為 1 的訊息,數字2、3、4 類似。彩色塊表示訊息資料,它們被掛在對應型別的鍊錶上。訊息型別為 0的鍊錶記錄了所有訊息加入佇列的順序,其中紅色箭頭表示訊息加入的順序。

system v標準下:

生成key

因為應用程序無法直接訪問核心訊息佇列中的資料結構,因此在程式中若要使用訊息佇列,需要乙個訊息佇列的標識,讓應用程序知道當前操作的是哪個訊息佇列。與其他的ipc機制一樣,程式必須提供乙個key來命名某個特定的訊息佇列,每個訊息佇列的key值是唯一的。

key_t ftok

(const

char

*pathname,

int proj_id)

;

ftok根據路徑名,提取檔案資訊,再根據這些檔案資訊及proj_id合成key;proj_id可以根據自己的約定,隨意設定,在unix系統上,它的取值是1到255。

開啟/建立訊息佇列 msgget

int

msgget

(key_t key,

int msg***)

;

msg***是乙個許可權標誌,表示訊息佇列的訪問許可權(與檔案的訪問許可權一樣)。msg***可以與ipc_creat進行操作,表示當key所命名的訊息佇列不存在時,建立乙個訊息佇列,並返回識別符號;如果key所命名的訊息佇列存在時,忽略ipc_creat標誌,只返回識別符號。

向訊息佇列傳送訊息msgsnd

int

msgsnd

(int msqid,

const

void

*msgp, size_t msgsz,

int msg***)

;

將msgp指向的訊息副本寫入識別符號為msgid的訊息佇列。

msgid:由msgget函式返回的訊息佇列標識碼,向該佇列中寫入訊息;

msgp:指標,指向準備傳送的訊息資料(標準格式);

msgze:msgp指向的訊息的正文長度(不包括訊息型別);

msg***:用於控制當前訊息佇列滿或佇列訊息到達系統範圍的限制時將要發生的事情。如果是0,當訊息隊列為滿時, msgsnd會阻塞;如果是ipc_nowait, 當訊息隊列為滿時,不阻塞,立即返回;

函式呼叫返回0表示成功,返回-1表示失敗。

從訊息佇列接收訊息msgrcv

int

msgrcv

(int msgid,

void

*msg_ptr, size_t msg_st,

long

int msgtype,

int msg***)

;

從識別符號為msgid的訊息佇列裡接收乙個指定型別的訊息,並存到msgp指向的訊息結構中,然後把訊息從訊息佇列中刪除。

msgtype可以實現一種簡單的接收優先順序。如果msgtype為0,就獲取佇列中的第乙個訊息。如果它的值大於0,將獲取相同型別的第乙個資訊。如果它小於0,就獲取型別等於或小於msgtype絕對值的第乙個訊息;

msg***用於控制當佇列中沒有相應型別的訊息可以接收時將發生的事情。如果是0 ,則一直等待;如果是ipc_nowait,則不會等待。

呼叫成功時,該函式返回放到接收快取區中的位元組數,訊息被複製到由msg_ptr指向的使用者分配的快取區中,然後刪除訊息佇列中的對應訊息。失敗時返回-1。

訊息佇列控制msgctl(刪除訊息)

int

msgctl

(int msgid,

int command,

struct msgid_ds *buf)

;

command是將要採取的動作,它可以取3個值:

ipc_stat:把msgid_ds結構中的資料設定為訊息佇列的當前關聯值

ipc_set:如果程序有足夠的許可權,就把訊息列隊的當前關聯值設定為msgid_ds結構中給出的值

ipc_rmid:刪除訊息佇列

buf是指向msgid_ds結構的指標,它指向訊息佇列模式和訪問許可權的結構。

msgid_ds結構至少包括以下成員:

struct msgid_ds   

;

呼叫成功返回0,失敗返回-1;

訊息佇列特點

通過使用訊息型別,程序可以按任何順序讀資訊,或為訊息安排優先順序順序。

每個訊息的長度有上限( msgmax),每個訊息佇列的總位元組數有上限(msgmnb),系統訊息佇列的總數有上限(msgmni)。

訊息佇列在建立後將一直存在,除非使用msgctl系統呼叫或iqcrm -q msgid命令刪除。

訊息佇列可以雙向通訊。

訊息佇列是基於訊息的,管道是基於位元組流的,訊息佇列比訊號能夠傳遞更多資訊。

程序間訊息佇列通訊

要保證server能夠接收client的訊息,就必須保證server的生成的msg的識別符號是一樣的,也就是兩個用的key是必須一樣的。msglucy.c include include include include include include include include include ...

程序間通訊(訊息佇列)

在嵌入式linux應用開發中,linux程序通訊的方式有6種,分別是管道 pipe 及有名管道 named pipe 訊號 signal 訊息佇列 msg 共享記憶體 shm 訊號量 和套接字 socket 在這我就簡單的描述一下程序通訊中的資訊佇列 msg 首先,訊息佇列的實現有重要的幾步 1 建...

程序間通訊 訊息佇列

有三種稱作xsi ipc的ipc 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...