Linux下進(jìn)程通訊消息隊(duì)列
?MQ(message queue),從字面意思上看,本質(zhì)是個(gè)隊(duì)列,F(xiàn)IFO 先入先出,只不過隊(duì)列中存放的內(nèi)容是message 而已。MQ 是在消息的傳輸過程中保存消息的容器。多用于分布式系統(tǒng)之間進(jìn)行通信。
消息隊(duì)列與 FIFO 很相似,都是一個(gè)隊(duì)列結(jié)構(gòu),都可以有多個(gè)進(jìn)程往隊(duì)列里面寫信息,多個(gè)進(jìn)程從隊(duì)列中讀取信息。
1.查看消息隊(duì)列命令
??1.查看消息隊(duì)列:ipcs -q
[wbyq@wbyq ~]$ ipcs -q
--------- 消息隊(duì)列 -----------
鍵 msqid 擁有者 權(quán)限 已用字節(jié)數(shù) 消息
0xb8104ad9 1 wbyq 644 0 0
0xd2350093 2 wbyq 666 208 2
??2.查看消息隊(duì)列限制信息:ipcs -lq
[wbyq@wbyq ~]$ ipcs -lq
---------- 消息限制 -----------
系統(tǒng)最大隊(duì)列數(shù)量 = 32000
最大消息尺寸 (字節(jié)) = 8192
默認(rèn)的隊(duì)列最大尺寸 (字節(jié)) = 16384
??3.查看消息隊(duì)列詳細(xì)信息:ipcs -q -i
[wbyq@wbyq ~]$ ipcs -q -i 2
消息隊(duì)列 msqid=2
uid=1000 gid=1000 cuid=1000 cgid=1000 模式=0666
cbytes=208 qbytes=16384 qnum=2 lspid=10177 lrpid=10175
發(fā)送時(shí)間=Thu Apr 28 11:56:08 2022
接收時(shí)間=Thu Apr 28 11:56:08 2022
更改時(shí)間=Thu Apr 28 11:49:04 2022
??4.創(chuàng)建消息隊(duì)列:ipcmk -Q
[wbyq@wbyq ~]$ ipcmk -Q
消息隊(duì)列 id:4
[wbyq@wbyq ~]$ ipcs -q
--------- 消息隊(duì)列 -----------
鍵 msqid 擁有者 權(quán)限 已用字節(jié)數(shù) 消息
0xb8104ad9 1 wbyq 644 0 0
0xd2350093 2 wbyq 666 208 2
0x05ae2c01 4 wbyq 644 0 0
5.刪除信號量:ipcrm -q
[wbyq@wbyq ~]$ ipcrm -q 4
[wbyq@wbyq ~]$ ipcs -q
--------- 消息隊(duì)列 -----------
鍵 msqid 擁有者 權(quán)限 已用字節(jié)數(shù) 消息
0xb8104ad9 1 wbyq 644 0 0
0xd2350093 2 wbyq 666 208 2
2.相關(guān)函數(shù)
#include
#include
#include
int msgget(key_t key, int msgflg);
函數(shù)功能:創(chuàng)建消息隊(duì)列
形參:key 鍵值,ftok產(chǎn)生
? ? ?msgflg?標(biāo)志 IPC_CREAT|0666
返回值:失敗返回-1,成功返回msqid
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
函數(shù)功能: 將消息添加到隊(duì)列中
形參:msqid msgget函數(shù)返回值
???msgp 消息內(nèi)容數(shù)據(jù),一般以結(jié)構(gòu)體類型填充
??????struct msgbuf {
????????????long mtype; /* 消息類型, 必須 > 0 */
????????????char mtext[1]; /消息數(shù)據(jù)/
????????????};
??????注意:struct msgbuf必須自己重寫,第一個(gè)參數(shù)long mtype必須指定,且>0,其他類型自定義
???msgsz 消息字節(jié)數(shù),大小為:sizeof(struct msgbuf)-sizeof(mtype);
???msgflg 0當(dāng)隊(duì)列滿時(shí)阻塞,直到消息寫入成功
??????IPC_NOWAIT 當(dāng)隊(duì)列滿時(shí)不阻塞,立刻返回
??????IPC_NOERROR 若發(fā)送的消息大于 size 字節(jié),則把該消息截?cái)?,截?cái)嗖糠謱⒈粊G棄,且不通知發(fā)送進(jìn)程。
返回值:成功返回0,失敗返回-1;
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
函數(shù)功能:從隊(duì)列中取出消息
形參:msqid msgget函數(shù)返回值
???msgp 存放讀取到的消息內(nèi)容
???msgsz 消息字節(jié)數(shù),大小為:sizeof(struct msgbuf)-sizeof(mtype);
???msgtyp 消息類型:
???????>0 接收對列中的第 1 個(gè)類型等于 msgtyp 的消息
???????==0 取出消息隊(duì)列中的第一條消息
???????<0 接收其類型小于或等于 msgtyp 絕對值的第 1 個(gè)最低類型消息
???msgflg 0 當(dāng)隊(duì)列空時(shí)阻塞,或者消息類型不匹配時(shí)阻塞
?????? IPC_NOWAIT 不阻塞,立刻返回
?????? IPC_NOERROR 若發(fā)送的消息大于 size 字節(jié),則把該消息截?cái)?,截?cái)嗖糠謱⒈粊G棄,且不通知發(fā)送進(jìn)程。
返回值:成功返回讀取的字節(jié)數(shù),失敗返回-1;
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
函數(shù)功能:控制函數(shù)
形參:msqid msgget函數(shù)返回值
???cmd 通常為 IPC_RMID 表示刪除消息隊(duì)列。
當(dāng)刪除消息隊(duì)列時(shí),則buf填NULL即可;
3.示例
??(1)創(chuàng)建消息隊(duì)列,添加消息到隊(duì)列
#include
#include
#include
#include
#include
#include
#include
struct msgbuf
{
long mtype;//消息類型,必須>0
int cnt;
char buff[100];
};
int main(int argc,char *argv[])
{
if(argc!=4)
{
printf("格式:./app <消息類型> <消息數(shù)據(jù)> <消息內(nèi)容>\n");
return 0;
}
key_t key=ftok("msgsnd.c", 1234);//生成鍵值
if(key==-1)
{
printf("生成鍵值失敗err=%s\n",strerror(errno));
return 0;
}
printf("key=%#x\n",key);
int msqid=msgget(key,IPC_CREAT|0666);//創(chuàng)建消息隊(duì)列
if(msqid==-1)
{
printf("創(chuàng)建消息隊(duì)列失敗err=%s\n",strerror(errno));
return 0;
}
printf("msqid=%d\n",msqid);
struct msgbuf msg;
msg.mtype=atoi(argv[1]);//消息類型
msg.cnt=atoi(argv[2]);//消息數(shù)據(jù)
strcpy(msg.buff,argv[3]);//消息內(nèi)容
int msg_size=sizeof(msg)-sizeof(long);//消息大小,總大小-消息類型大小
/*添加消息到隊(duì)列*/
int size=msgsnd(msqid,&msg,msg_size,0);
if(size==-1)
{
printf("寫入消息失敗err=%s\n",strerror(errno));
}
else printf("消息寫入成功\n");
return 0;
}
??(2)從隊(duì)列中取消息
#include
#include
#include
#include
#include
#include
#include
struct msgbuf
{
long mtype;//消息類型,必須>0
int cnt;
char buff[100];
};
int main(int argc,char *argv[])
{
if(argc!=2)
{
printf("格式:./app <消息類型>\n");
return 0;
}
key_t key=ftok("msgsnd.c", 1234);//生成鍵值
if(key==-1)
{
printf("生成鍵值失敗err=%s\n",strerror(errno));
return 0;
}
printf("key=%#x\n",key);
int msqid=msgget(key,IPC_CREAT|0666);//創(chuàng)建消息隊(duì)列
if(msqid==-1)
{
printf("創(chuàng)建消息隊(duì)列失敗err=%s\n",strerror(errno));
return 0;
}
printf("msqid=%d\n",msqid);
struct msgbuf msg;
int msg_size=sizeof(msg)-sizeof(long);//消息大小
long msgtyp=atoi(argv[1]);//要寫讀取的消息類型
//從消息隊(duì)列中取數(shù)據(jù)
ssize_t size=msgrcv(msqid,&msg,msg_size,msgtyp,0);
if(size==-1)
{
printf("讀取消息失敗err=%s\n",strerror(errno));
}
else
{
printf("------------讀取消息成功size:%ld----------------\n",size);
printf("\tmtype=%ld\n",msg.mtype);
printf("\tcnt=%d\n",msg.cnt);
printf("\tbuff=%s\n",msg.buff);
}
return 0;
}
??(3)運(yùn)行效果

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219009 -
IPC
+關(guān)注
關(guān)注
3文章
378瀏覽量
54885 -
進(jìn)程
+關(guān)注
關(guān)注
0文章
211瀏覽量
14532
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
中興通訊全隊(duì)列多形態(tài)AI終端產(chǎn)品亮相MWC 2026
3月2日,在2026年世界移動大會(MWC26巴塞羅那)上,中興通訊終端業(yè)務(wù)攜全隊(duì)列、多形態(tài)AI終端產(chǎn)品亮相。搭載豆包手機(jī)助手的AI原生手機(jī)努比亞M153豆包手機(jī)助手技術(shù)預(yù)覽版迎來海外首秀,主打情感陪伴的AI“新物種”iMoochi也在本次展會發(fā)布。
飛凌嵌入式ElfBoard-進(jìn)程之什么是進(jìn)程
在Linux系統(tǒng)中,有些基本命令能夠查看到進(jìn)程的信息。例如ps、top、pgrep、pstree等;這些命令為用戶提供了查看和管理Linux進(jìn)程信息的多種功能。通過合理使用這些命令,用
發(fā)表于 03-02 08:49
Linux進(jìn)程管理不用愁!這6個(gè)工具幫你搞定90%場景
在 Linux 系統(tǒng)中,進(jìn)程是資源分配的基本單位,無論是服務(wù)器運(yùn)維、程序調(diào)試還是日常使用,掌握進(jìn)程管理工具都是必備技能。今天就帶大家梳理 6 個(gè)最常用的進(jìn)程管理工具,從查看
Linux進(jìn)程樹分析工具pstree詳解與實(shí)戰(zhàn)指南(另一視角優(yōu)化Linux系統(tǒng))
在 Linux 系統(tǒng)開發(fā)與運(yùn)維中,理解進(jìn)程的運(yùn)行狀態(tài)和相互關(guān)系是排查問題、優(yōu)化性能的基礎(chǔ)。pstree 作為一款輕量高效的進(jìn)程樹可視化工具,能直觀展示系統(tǒng)中所有進(jìn)程的父子關(guān)系,為系統(tǒng)分
RDMA設(shè)計(jì)24:隊(duì)列管理模塊設(shè)計(jì)
隊(duì)列管理模塊采用管理與存儲分離的結(jié)構(gòu)進(jìn)行設(shè)計(jì),由發(fā)送隊(duì)列存儲、發(fā)送隊(duì)列管理、接收隊(duì)列管理、完成條目解析、異常完成條目處理和 Round-Robin 仲裁組成。
進(jìn)程通信
直接把消息發(fā)送給接收進(jìn)程,并將它掛在接收進(jìn)程的消息緩沖隊(duì)列上,接收進(jìn)程從消息緩沖隊(duì)列中取得消息。
2) 間接通信方式:發(fā)送
發(fā)表于 01-15 06:16
進(jìn)程的控制
、初始化處理機(jī)狀態(tài)信息和初始化處理機(jī)控制信息,以及設(shè)置進(jìn)程的優(yōu)先級等。
4. 如果進(jìn)程就緒隊(duì)列能夠接納新進(jìn)程,就將新進(jìn)程插入到就緒
發(fā)表于 01-15 06:05
深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)
在Linux系統(tǒng)中,進(jìn)程調(diào)度就像一位精明的“CPU管理員”——它決定著哪個(gè)進(jìn)程能優(yōu)先使用CPU,多久切換一次進(jìn)程,如何平衡系統(tǒng)響應(yīng)速度與資源利用率。小到桌面應(yīng)用的流暢點(diǎn)擊,大到服務(wù)器的
解析Linux的進(jìn)程、線程和協(xié)程
)進(jìn)程間通信(IPC):Linux提供了多種IPC機(jī)制,如管道、信號、共享內(nèi)存和消息隊(duì)列,用于進(jìn)程之間的通信。
線程管理
在Linux中,線
發(fā)表于 12-22 11:00
Linux進(jìn)程間通信(IPC)全解析:從管道到?Socket,一篇講透
在?Linux?世界里,進(jìn)程并非孤立存在。無論是后臺服務(wù)協(xié)作(如?Web?服務(wù)器與數(shù)據(jù)庫)、命令行工具聯(lián)動(如ps | grep),還是復(fù)雜應(yīng)用的模塊通信,都離不開 進(jìn)程間通信(IPC
【HZ-T536開發(fā)板免費(fèi)體驗(yàn)】—— linux 進(jìn)程創(chuàng)建
Linux進(jìn)程通信方式有這幾種:
1。管道
2。信號量
3。消息隊(duì)列
4。共享內(nèi)存
在本帖子中,我會講解fork(),exit()系統(tǒng)調(diào)用的實(shí)踐。通過應(yīng)用編程來實(shí)現(xiàn)系統(tǒng)調(diào)用。
1,進(jìn)程
發(fā)表于 09-01 20:49
NVME控制器之隊(duì)列管理模塊
隊(duì)列管理模塊是整個(gè)NVMe Host控制器的核心模塊,該模塊實(shí)現(xiàn)了提交隊(duì)列與完成隊(duì)列的管理,多隊(duì)列請求的仲裁判決等功能。隊(duì)列管理模塊中含有數(shù)
Linux后臺進(jìn)程管理詳解
當(dāng)我們在終端或控制臺工作時(shí),可能不希望由于運(yùn)行一個(gè)作業(yè)而占住了屏幕,因?yàn)榭赡苓€有更重要的事情要做,比如閱讀電子郵件。對于密集訪問磁盤的進(jìn)程,我們更希望它能夠在每天的非負(fù)荷高峰時(shí)間段運(yùn)行(例如凌晨)。為了使這些進(jìn)程能夠在后臺運(yùn)行,也就是說不在終端屏幕上運(yùn)行,有幾種選擇方法可
Linux系統(tǒng)進(jìn)程管理入門指南
在 Linux 系統(tǒng)中,進(jìn)程是正在運(yùn)行的程序的實(shí)例。理解進(jìn)程的管理、查看和控制對于系統(tǒng)管理員和開發(fā)者來說非常重要
Linux進(jìn)程狀態(tài)詳解
進(jìn)程狀態(tài)是task_struct內(nèi)的一個(gè)整數(shù);進(jìn)行:進(jìn)程在調(diào)度隊(duì)列中,進(jìn)程的狀態(tài)都是running,阻塞:等待某種設(shè)備或者資源就緒。進(jìn)程是一
Linux下進(jìn)程通訊消息隊(duì)列
評論