程序間通訊 訊息佇列

2021-08-29 23:48:47 字數 1760 閱讀 3928

訊息佇列是訊息的鏈結表,存放在核心中並由訊息佇列識別符號標識。建立乙個新的訊息佇列或者開啟乙個已經存在的佇列所使用的系統呼叫為msgget

key:表示使用者態所給出的key值(相當於檔名),

flag:引數表示對該佇列所擁有的許可權。呼叫成功後會返回乙個msgid(相當於檔案描述符)。

msgctl函式可以對訊息佇列執行多種操作,他和另外兩個與訊號量和共享記憶體有關的函式semctl,shmctl是類似的函式。

msgid:引數表示要作用的訊息佇列的id

cmd:引數表示要對該訊息佇列所執行的操作,

buf:表示乙個msgid_ds型別的結構體指標,若不用返回什麼數時,最後乙個引數也可為0.

呼叫msgsnd系統呼叫函式將資料放到訊息佇列的尾端。

msgid:訊息佇列id

ptr:指向mymsg結構(要傳輸的訊息的結構,裡面包含所要傳輸資料的型別)的指標,接收者可以使用訊息型別以非先進先出的次序取出訊息

nbytes:要傳輸資料的大小

falg:該引數可以被指定為ipc_nowait,類似於非阻塞標誌,若訊息佇列已滿,則指定ipc_nowait使得msgsnd函式立即出錯返回eagain,也可以指定為0(不阻塞)。

msgrcv系統呼叫用來從佇列中取用訊息:

msgid:訊息佇列id

ptr:存放實際訊息資料的緩衝區

nbytes:緩衝區的長度

type:指定想要獲取的訊息型別

flag:一般情況下指定為0

我們來看乙個例子:

用a程序向訊息佇列中傳送資料,b程序接收並輸出

#include #include #include #include #include #include typedef struct  data

data;

int main()

b.c

#include #include #include #include #include #include typedef struct data

data;

int main()

; msgrcv(msgid, &val, sizeof(data), 1000, 0);

printf("type = %d, text = %s\n", val.type, val.text);

msgrcv(msgid, &val, sizeof(data), 2000, 0);

printf("type = %d, text = %s\n", val.type, val.text);

exit(0);

}

執行結果如下:

程序間訊息佇列通訊

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