訊息佇列簡記

2021-05-10 22:33:22 字數 1370 閱讀 3174

訊息佇列簡記

在了解了訊號量和共享記憶體之後,訊息佇列自然就比較容易理解了。

之前提到共享記憶體的操作不是原子的, 那麼便可以結合訊號量來進行控制。

訊息佇列是另外一種程序間通訊的手段, 使用以下幾個函式呼叫。

#include

#include

#include //一般上述兩個標頭檔案都被此檔案包含

int msgget(key_t key, int msg***);

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***);

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg***);

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

由此可見幾種ipc機制都是類似的。

msgget(key, msg***);

同樣的道理,該函式建立或獲取乙個和key相關的訊息佇列,一般使用 0666 | ipc_creat作為msg***的值。看到0666很容易想到777(關於chmod),很容易可以知道是設定許可權。

操作的是低9位, 666就是110110110。從高到低對應著u(使用者),g(組別), o(其他)的讀、寫和執行許可權。比如最高三位110表示u有讀和寫許可權,但沒有執行許可權。

函式返回乙個msgid,供其它相關函式使用。

msgsnd(msgid, msgp, msgsz, msg***);

一般來說,訊息佇列中的訊息成員都是乙個結構體,該結構體至少包含兩個成員: 乙個是訊息型別,另乙個是訊息資料。

比如:而msgp就是指向要傳送的訊息的指標。

msgsz是訊息的大小,不包含訊息型別。

msg***一般置0。

msgrcv(msgid, msgp, msgsz, msgtyp, msg***);

與msgsnd類似,不同的是第4個引數msgtyp。

msgtyp指定了要接收的訊息型別, 一共有3種情況。

1. msgtyp為0, 表示按順序接收訊息佇列中的成員。

2. msgtyp為某正數,表示接收型別為該正數的訊息,型別由訊息結構體中的msg_type指定。

3. msgtyp為某負數,表示接收型別小於等於該負數絕對值的型別訊息。

msgctl一般用來撤銷訊息佇列,形如 msgctl(msgid, ipc_rmid, 0)。

下面是個小實驗:

用於傳送訊息的msg1.c:

用於接收訊息的msg2.c(指定接收資料型別為1的訊息):

jason lee

2009-11-16 p.m

訊息佇列 訊息佇列

輪詢排程 一次性分發所有訊息,保證訊息平均分配,不管消費者是否能正常消費 訊息應答 保證消費端能確實消費,不丟失 公平 乙個乙個分發所有訊息,在保證分發到的執行緒確認回覆後,才分發下個訊息給下個空閒的消費者,訊息持久化 保證佇列中的訊息不丟失,包括3要素 交換器 訊息佇列 訊息都必須宣告持久化 發布...

訊息佇列 訊息佇列 kafka

kafka是乙個分布式的基於發布 訂閱模式的訊息佇列,主要用於大資料實時處理領域。要理解kafka首先要有分布式的概念,要有訊息佇列的概念。分布式系統最大的優勢就是解耦和削峰,這種情況下,a系統生成了乙個訊息,b系統非同步獲取,那麼就需要乙個存放訊息的訊息佇列 mq 相比較傳統的訊息佇列,訊息被消費...

linux訊息佇列 Linux訊息佇列

訊息佇列,unix的通訊機制之一,可以理解為是乙個存放訊息 資料 容器。將訊息寫入訊息佇列,然後再從訊息佇列中取訊息,一般來說是先進先出的順序。可以解決兩個程序的讀寫速度不同 處理資料速度不同 系統耦合等問題,而且訊息佇列裡的訊息哪怕程序崩潰了也不會消失。最簡單的訊息記憶體的使用流程 ftok函式生...