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 相比較傳統的訊息佇列,訊息被消費...