system v訊息佇列使用訊息佇列識別符號。只要有許可權任何程序可以往訊息佇列寫,任何程序也可以往訊息佇列讀
在裡維護了乙個訊息頭
struct msqid_ds
msgget函式用於建立乙個新的訊息佇列或訪問乙個已經存在的訊息佇列
#include int msgget(key_t key,int oflag);
返回值是乙個整數識別符號,其他三個msg函式用它來指定這個佇列。基於key產生的,而key既可以死ftok的返回值,也可以是ipc_private
oflag標示讀寫許可權,常見的巨集ipc_creat,ipc_excl按位或
當穿件乙個新的訊息佇列的時候,msqid_ds結構的如下成員被初始化
msg_perm結構的uid和cuid成員被設定當成這個程序的有效用虎id,gid和cgid成員被設定稱為當前程序的有效組id。
oflag中的讀寫許可權位存放在msg_perm.mode中。
msg_qnum、msg_lspid、msg_lrpid、msg_stime和msg_rtime被設定為0
msg_ctime 被設定成當前的時間
msg_qbytes被設定為系統的限制的值。
使用msgget開啟乙個訊息佇列之後,我們使用msgsnd往其上放置乙個訊息。
#include int msgsnd(int msqid,const void *ptr,size_t length,int flag);
如果成功就返回0,出錯就返回-1
ptr有下面的模板
struct msgbuf
訊息型別必須大於0,因為對於msgrcv函式來說,非正式的訊息型別用作特殊的指示器,我們在下乙個章節講述。
msgbuf的結構定義中mtext不大確切,訊息的資料不只是侷限文字,任何形式都是可以的,無論是二進位制資料還是文字,核心根本不解釋訊息資料的內容。
我們使用模板的說法描述這個結構,因為ptr鎖指向的只是乙個含有訊息型別的長整數,訊息本身僅僅跟在他的後面。大多數應用不適用ms_gbuf結構這個定義,因為其資料通常是不夠的。
大多數訊息有自己的結構
我們也可以定義下面的結構
typedef struct my_msgbufmessage;
我門在使用上面的結構體用msgsnd傳送的時候要設定sizeof(message)-sizeof(long)
flag引數可以是0,也可以是ipc_nowait。呼叫msg_snd變成了非阻塞,如果沒有新的訊息就馬上返回
指定佇列已經滿了
系統範圍內存在太多訊息
如果有乙個條件存在並且ipc_nowait標誌已經指定,msgsnd就返回乙個eagain錯誤。如果沒指定,那麼呼叫執行緒投入睡眠。
具備則存放新的訊息空間
msgsqid標識的訊息佇列從系統中刪除(返回乙個eidrm錯誤)
呼叫執行緒**乙個訊號中斷,返回eintr錯誤
使用msgrcv函式從某個訊息佇列中讀出乙個訊息
#include size_t msgrcv(int msqid,void *ptr,size_t length,long type,int flag);
type指的是希望從給定的佇列中讀出什麼樣的訊息。
如果type為0,就返回這個佇列中的第乙個訊息。既然每個訊息佇列都是作為乙個fifo鍊錶維護的,因此type為0指定返回該訊息佇列中最早的訊息。
type大於0,那就返回其型別值為type的第乙個訊息。
如果type小於0,那就返回他的型別值小於或者等於type引數的絕對值的訊息中型別值最小的乙個訊息。
訊息佇列 訊息佇列
輪詢排程 一次性分發所有訊息,保證訊息平均分配,不管消費者是否能正常消費 訊息應答 保證消費端能確實消費,不丟失 公平 乙個乙個分發所有訊息,在保證分發到的執行緒確認回覆後,才分發下個訊息給下個空閒的消費者,訊息持久化 保證佇列中的訊息不丟失,包括3要素 交換器 訊息佇列 訊息都必須宣告持久化 發布...
訊息佇列 訊息佇列 kafka
kafka是乙個分布式的基於發布 訂閱模式的訊息佇列,主要用於大資料實時處理領域。要理解kafka首先要有分布式的概念,要有訊息佇列的概念。分布式系統最大的優勢就是解耦和削峰,這種情況下,a系統生成了乙個訊息,b系統非同步獲取,那麼就需要乙個存放訊息的訊息佇列 mq 相比較傳統的訊息佇列,訊息被消費...
linux訊息佇列 Linux訊息佇列
訊息佇列,unix的通訊機制之一,可以理解為是乙個存放訊息 資料 容器。將訊息寫入訊息佇列,然後再從訊息佇列中取訊息,一般來說是先進先出的順序。可以解決兩個程序的讀寫速度不同 處理資料速度不同 系統耦合等問題,而且訊息佇列裡的訊息哪怕程序崩潰了也不會消失。最簡單的訊息記憶體的使用流程 ftok函式生...