16 訊息佇列1

2021-07-26 08:53:53 字數 2344 閱讀 4671

1.管道、佇列 與ipc的訊息佇列有什麼區別呢?

訊息佇列是鏈式的,訊息的型別可以不一致。

訊息佇列中維護佇列的結構體msqid_ds,其中的第乙個訊息指標msg_first,最後乙個指標msg_last..

每個訊息中包含資料data,資料的長度length,資料的型別type。

2.訊息佇列建立函式msgget

建立了訊息佇列後可以通過system("ipcs -q");檢視佇列資訊

標頭檔案: #include

#include

#include

函式原型: int msgget(key_t key, int flag);

引數: key,和訊息佇列關聯的key值

flag,訊息佇列的訪問許可權

返回: 成功,訊息佇列id

出錯:-1

3.傳送訊息佇列msgsnd

函式原型: int msgsnd(int msqid, const void *msgp, size_t size, int flag)

引數: msqid,訊息佇列id

msgp,指向訊息的指標

常用訊息結構msgbuf如下:

struct msgbuf

size,傳送的訊息正文位元組數

flag,ipc_nowait,訊息沒有傳送完函式也會立即返回

0,直到傳送完函式才返回

返回:成功0

出錯-1

4.接收訊息函式msgrcv

函式原型: int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int flag)

引數: msgid,訊息佇列號

msgp,接收訊息的緩衝區

size,要接收的訊息位元組數

msgtype,0:接收訊息佇列中第乙個訊息

>0,接收訊息佇列中第乙個型別為msgtype的訊息

<0,接收訊息佇列中型別值不大於msgtype的絕對值切型別值又最小的訊息

flag,0:若無訊息函式一直阻塞

ipc_nowait,若沒訊息,程序立即返回enomsg

返回: 成功,接收到的訊息長度

出錯-1

5.訊息佇列控制函式msgctl

原型: int msgctl(int msgqid, int cmd, struct msgqid_ds *buf)

引數: msgid,訊息佇列id

cmd,ipc_stat,讀取訊息佇列的屬性,並將其儲存在buf指向的緩衝區

ipc_set,設定訊息佇列屬性,這個值取自buf引數

ipc_rmid,從系統中刪除訊息佇列

buf,訊息佇列緩衝區

返回: 成功0,,出錯-1

6.例項

#include "sys/types.h"

#include "sys/msg.h"

#include "signal.h"

#include "unistd.h"

#include "stdio.h"

#include "stdlib.h"

int main()

printf("creat message queue sucess msgid=%d\n",msgid);

system("ipcs -q");

//delete message queue

msgctl(msgid,ipc_rmid,null);

system("ipcs -q");

return 0;

}

執行結果:

alex@alex-virtual-machine:/extra/process/sixteen$ ./a.out

creat message queue sucess msgid=0

------ message queues --------

key msqid owner perms used-bytes messages

0x00000000 0 alex 777 0 0

------ message queues --------

key msqid owner perms used-bytes messages

alex@alex-virtual-machine:/extra/process/sixteen$

訊息佇列 訊息佇列

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

1 選擇訊息佇列MQ

更快的返回結果。減少等待,實現了步驟之間的併發,提公升系統整體效能。使用訊息佇列隔離閘道器和後端服務,以達到流量控制和保護後端服務的目的。秒殺開始後,當短時間內大量的秒殺請求到達閘道器時,不會直接衝擊到後端的秒殺服務,而是先堆積在訊息佇列中,後端服務按照自己的最大處理能力,從訊息佇列中消費請求進行處...

訊息佇列 訊息佇列 kafka

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