目錄
一、消息隊列的定義
二、相關函數?
2.1 msgget?函數
2.2 msgsnd 函數
2.3 msgrcv 函數
2.4 msgctl 函數
三、消息隊列的操作
?3.1 創建消息隊列
3.2 獲取消息隊列并發送消息?
3.3?從消息隊列接收消息recv?
四、 刪除消息隊列
4.1 ipcrm
4.2?msgctl函數?
一、消息隊列的定義
消息隊列是一種用于在應用程序之間傳遞和存儲數據的通信機制。它允許應用程序將消息發送到隊列中,然后由另一個應用程序從隊列中接收和處理這些消息。消息隊列可以有效地實現異步通信、解耦應用程序之間的依賴關系,以及實現消息的持久化和順序處理。常見的消息隊列系統包括RabbitMQ、Kafka、ActiveMQ等。消息隊列在現代分布式系統和微服務架構中被廣泛應用。
二、相關函數?
2.1 msgget?函數
msgget()創建或者獲取一個消息隊列
函數模型:
int msgget(key_t key,int msqflg);
函數參數:
? ? ? ? 1.msqflg: IPC_CREAT
返回值:???????? msgget()成功返回消息隊列 ID,失敗返回-1
2.2 msgsnd 函數
函數模型:
int msgsnd(int msqid, const void *msqp, size_t msqsz, int msqflg);
msgsnd()發送一條消息,消息結構為:struct msgbuf{????????long mtype; // 消息類型, 必須大于 0????????char mtext[1]; // 消息數據}
函數參數:??????? ?1.msqsz: 指定 mtext 中有效數據的長度? ? ? ? 2.msqflg:一般設置為 0 可以設置 IPC_NOWAIT返回值:????????msgsnd()成功返回 0, 失敗返回-1
2.3 msgrcv 函數
msgrcv() 接收一條消息
函數模型:
ssize_t msgrcv(int msqid, void *msgp, size_t msqsz, long msqtyp, int msqflg);
函數參數:
???????? 1.msqtyp: 指定接收的消息類型,類型可以為 0? ? ? ? 2.msqflg: 一般設置為 0 可以設置 IPC_NOWAIT返回值:???????? msgrcv()成功返回 mtext 中接收到的數據長度, 失敗返回-1
2.4 msgctl 函數
msgctl() 控制消息隊列
函數模型:
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
?函數參數:
? ? ? ? cmd: IPC_RMID返回值:
????????msgctl()成功返回 0,失敗返回-1
三、消息隊列的操作
?3.1 創建消息隊列
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>int main()
{int msgid=msgget((key_t)1234,IPC_CREAT|0600);if(msgid==-1){printf("msgid err\n");exit(1);}}
通過ipcs 命令查看是否已經創建好了消息隊列
3.2 獲取消息隊列并發送消息?
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>struct mess
{long type;char buff[32];
};int main()
{int msgid=msgget((key_t)1234,IPC_CREAT|0600);if(msgid==-1){printf("msgid err\n");exit(1);}struct mess dt;dt.type=1;//1類型消息strcpy(dt.buff,"hello1");msgsnd(msgid,(void*)&dt,32,0);}
?ipcs -q 只顯示消息隊列
?ipcs -m 只顯示共享內存
?ipcs -s 只顯示信號量
msgsnd 函數 發送消息:
msgsnd(msgid, &dt, 32, 0); 使用 msgsnd 函數向消息隊列發送消息。msgid 是之前通msgget 獲取的消息隊列標識符;
msgid是往哪個消息隊列中添加;
&dt 是指向要發送的消息結構體的指針;
32 是要發送的消息數據的長度;
0 是消息發送的標志,這里使用默認值。
3.3?從消息隊列接收消息recv?
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/msg.h>struct mess
{long type;char buff[32];
};int main()
{int msgid=msgget((key_t)1234,IPC_CREAT|0600);if(msgid==-1){printf("msgid err\n");exit(1);}struct mess dt;msgrcv(msgid,&dt,32,1,0);printf("recv:%s\n",dt.buff);
}
運行此文件,會發現消息隊列數會隨執行的次數增加而減少
并且運行三次之后消息讀完了再運行會堵塞
四、 刪除消息隊列
4.1 ipcrm
刪除消息隊列中的消息用 ipcrm -q msqid 的號。
4.2?msgctl函數?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>struct mess
{long type; char buff[32];
};int main()
{int msgid = msgget((key_t)1234, IPC_CREAT|0600);if (msgid == -1) {printf("msgget err\n");exit(1);}struct mess dt;msgrcv(msgid, &dt, 32, 2, 0);//意思讀2號消息printf("read msg:%s\n", dt.buff);//打印消息msgctl(msgid,IPC_RMID,NULL);
}