一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux下進(jìn)程通訊消息隊(duì)列

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-08-19 19:56 ? 次閱讀

Linux下進(jìn)程通訊消息隊(duì)列

?MQ(message queue),從字面意思上看,本質(zhì)是個(gè)隊(duì)列,F(xiàn)IFO 先入先出,只不過(guò)隊(duì)列中存放的內(nèi)容是message 而已。MQ 是在消息的傳輸過(guò)程中保存消息的容器。多用于分布式系統(tǒng)之間進(jìn)行通信。

消息隊(duì)列與 FIFO 很相似,都是一個(gè)隊(duì)列結(jié)構(gòu),都可以有多個(gè)進(jìn)程往隊(duì)列里面寫(xiě)信息,多個(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.刪除信號(hào)量: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)體類(lèi)型填充
??????struct msgbuf {
????????????long mtype; /* 消息類(lèi)型, 必須 > 0 */
????????????char mtext[1]; /消息數(shù)據(jù)/
????????????};
??????注意:struct msgbuf必須自己重寫(xiě),第一個(gè)參數(shù)long mtype必須指定,且>0,其他類(lèi)型自定義
???msgsz 消息字節(jié)數(shù),大小為:sizeof(struct msgbuf)-sizeof(mtype);
???msgflg 0當(dāng)隊(duì)列滿時(shí)阻塞,直到消息寫(xiě)入成功
??????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 消息類(lèi)型:
???????>0 接收對(duì)列中的第 1 個(gè)類(lèi)型等于 msgtyp 的消息
???????==0 取出消息隊(duì)列中的第一條消息
???????<0 接收其類(lèi)型小于或等于 msgtyp 絕對(duì)值的第 1 個(gè)最低類(lèi)型消息
???msgflg 0 當(dāng)隊(duì)列空時(shí)阻塞,或者消息類(lèi)型不匹配時(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;//消息類(lèi)型,必須>0
	int cnt;
	char buff[100];
};
int main(int argc,char *argv[])
{
	if(argc!=4)
	{
		printf("格式:./app <消息類(lèi)型> <消息數(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]);//消息類(lèi)型
	msg.cnt=atoi(argv[2]);//消息數(shù)據(jù)
	strcpy(msg.buff,argv[3]);//消息內(nèi)容
	int msg_size=sizeof(msg)-sizeof(long);//消息大小,總大小-消息類(lèi)型大小
	/*添加消息到隊(duì)列*/
	int size=msgsnd(msqid,&msg,msg_size,0);
	if(size==-1)
	{
		printf("寫(xiě)入消息失敗err=%s\n",strerror(errno));
	}
	else printf("消息寫(xiě)入成功\n");
	return 0;
}  

??(2)從隊(duì)列中取消息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
struct msgbuf
{
	long mtype;//消息類(lèi)型,必須>0
	int cnt;
	char buff[100];
};
int main(int argc,char *argv[])
{
	if(argc!=2)
	{
		printf("格式:./app <消息類(lè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;
	int msg_size=sizeof(msg)-sizeof(long);//消息大小
	long msgtyp=atoi(argv[1]);//要寫(xiě)讀取的消息類(lèi)型
	//從消息隊(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)行效果

pYYBAGL_eXuABxWmAAeJ5O7XsAY981.png#pic_center


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11420

    瀏覽量

    212319
  • IPC
    IPC
    +關(guān)注

    關(guān)注

    3

    文章

    359

    瀏覽量

    52694
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    206

    瀏覽量

    14180
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux后臺(tái)進(jìn)程管理詳解

    當(dāng)我們?cè)诮K端或控制臺(tái)工作時(shí),可能不希望由于運(yùn)行一個(gè)作業(yè)而占住了屏幕,因?yàn)榭赡苓€有更重要的事情要做,比如閱讀電子郵件。對(duì)于密集訪問(wèn)磁盤(pán)的進(jìn)程,我們更希望它能夠在每天的非負(fù)荷高峰時(shí)間段運(yùn)行(例如凌晨)。為了使這些進(jìn)程能夠在后臺(tái)運(yùn)行,也就是說(shuō)不在終端屏幕上運(yùn)行,有幾種選擇方法可
    的頭像 發(fā)表于 04-25 11:04 ?122次閱讀
    <b class='flag-5'>Linux</b>后臺(tái)<b class='flag-5'>進(jìn)程</b>管理詳解

    Linux系統(tǒng)進(jìn)程管理入門(mén)指南

    Linux 系統(tǒng)中,進(jìn)程是正在運(yùn)行的程序的實(shí)例。理解進(jìn)程的管理、查看和控制對(duì)于系統(tǒng)管理員和開(kāi)發(fā)者來(lái)說(shuō)非常重要
    的頭像 發(fā)表于 04-22 14:34 ?170次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>進(jìn)程</b>管理入門(mén)指南

    LinuxVim編輯器的使用技巧

    【Vim】常用總結(jié)? 簡(jiǎn)介? image 什么是vim?? Linux兩大編輯神器之一 vim ? Linux/Unix使用最多的編輯器 ? vi的改進(jìn)版 ? 可能是最難上手的編輯
    的頭像 發(fā)表于 04-01 17:36 ?282次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>Vim編輯器的使用技巧

    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)程是一
    的頭像 發(fā)表于 04-01 09:46 ?176次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>狀態(tài)詳解

    中興通訊亮相2025年世界移動(dòng)通信大會(huì)

    近日,中興通訊攜全隊(duì)列多形態(tài)AI終端亮相世界移動(dòng)通信大會(huì)(MWC25巴塞羅那),為全球用戶帶來(lái)全場(chǎng)景AI體驗(yàn)。
    的頭像 發(fā)表于 03-10 10:12 ?499次閱讀

    Linux計(jì)劃任務(wù)cron詳解

    cron是linux用來(lái)周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個(gè)守護(hù)進(jìn)程,與windows的計(jì)劃任務(wù)類(lèi)似,當(dāng)安裝完成操作系統(tǒng)后,默認(rèn)會(huì)安裝此服務(wù) 工具,并且會(huì)自動(dòng)啟動(dòng)crond
    的頭像 發(fā)表于 02-07 15:31 ?531次閱讀
    <b class='flag-5'>Linux</b>計(jì)劃任務(wù)cron詳解

    深入解析Linux程序與進(jìn)程

    什么是程序 一組計(jì)算機(jī)能識(shí)別和執(zhí)行的指令,用于指導(dǎo)計(jì)算機(jī)執(zhí)行特定任務(wù)或解決特定問(wèn)題。程序通常由代碼、數(shù)據(jù)和資源文件組成,涉及語(yǔ)法、算法和數(shù)據(jù)結(jié)構(gòu)。為二進(jìn)制文件 什么是進(jìn)程 是一個(gè)具有獨(dú)立功能的程序
    的頭像 發(fā)表于 12-18 11:01 ?345次閱讀
    深入解析<b class='flag-5'>Linux</b>程序與<b class='flag-5'>進(jìn)程</b>

    Linux之CPU調(diào)度策略和CPU親和性

    一、調(diào)度策略 調(diào)度進(jìn)程 單個(gè) CPU一次只能執(zhí)行一個(gè)進(jìn)程,雖然 Linux 系統(tǒng)通過(guò)使用多任務(wù)同時(shí)處理多個(gè)進(jìn)程,但當(dāng)多個(gè)進(jìn)程同時(shí)運(yùn)行在一個(gè)C
    的頭像 發(fā)表于 12-05 16:38 ?917次閱讀
    <b class='flag-5'>Linux</b>之CPU調(diào)度策略和CPU親和性

    JavaWeb消息隊(duì)列使用指南

    用程序的通信方法,允許異步傳輸消息,并且具有存儲(chǔ)和轉(zhuǎn)發(fā)消息的能力。它主要解決以下問(wèn)題: 異步處理 :允許系統(tǒng)組件異步處理任務(wù),提高響應(yīng)速度。 解耦系統(tǒng) :不同系統(tǒng)組件之間通過(guò)消息隊(duì)列通信,降低耦合度。 流量削峰 :在高流量情況,消息隊(duì)
    的頭像 發(fā)表于 11-25 09:27 ?364次閱讀

    深入Linux進(jìn)程管理:提升效率與穩(wěn)定性的關(guān)鍵方法

    目錄 Linux進(jìn)程管理 8.1 IO負(fù)載 8.2 實(shí)時(shí)進(jìn)程監(jiān)控 5.1 作業(yè)與會(huì)話 5.2 作業(yè)分類(lèi) 4.1 ps 4.2pstree 4.3pgrep 4.4pidof 4.5 vmstat
    的頭像 發(fā)表于 11-22 11:05 ?607次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>管理:提升效率與穩(wěn)定性的關(guān)鍵方法

    一文搞懂Linux進(jìn)程的睡眠和喚醒

    ): 進(jìn)程在等待某個(gè)條件滿足(如I/O操作),可以被信號(hào)喚醒。 Linux通過(guò)內(nèi)核提供的系統(tǒng)調(diào)用來(lái)控制進(jìn)程的睡眠。常用的系統(tǒng)調(diào)用有: sleep(): 使進(jìn)程暫停指定的秒數(shù)。 usl
    發(fā)表于 11-04 15:15

    Linux用戶身份與進(jìn)程權(quán)限詳解

    在學(xué)習(xí) Linux 系統(tǒng)權(quán)限相關(guān)的主題時(shí),我們首先關(guān)注的基本都是文件的 ugo 權(quán)限。ugo 權(quán)限信息是文件的屬性,它指明了用戶與文件之間的關(guān)系。但是真正操作文件的卻是進(jìn)程,也就是說(shuō)用戶所擁有的文件
    的頭像 發(fā)表于 10-23 11:41 ?639次閱讀
    <b class='flag-5'>Linux</b>用戶身份與<b class='flag-5'>進(jìn)程</b>權(quán)限詳解

    嵌入式環(huán)形隊(duì)列與消息隊(duì)列的實(shí)現(xiàn)原理

    嵌入式環(huán)形隊(duì)列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊(duì)列,是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于在固定大小的存儲(chǔ)區(qū)域中高效地存儲(chǔ)和訪問(wèn)數(shù)據(jù)。其主要特點(diǎn)包括固定大小的數(shù)組和兩個(gè)指針(頭指針和尾指針),分別指向隊(duì)列的起始位置和結(jié)束位置。
    的頭像 發(fā)表于 09-02 15:29 ?976次閱讀

    深入探討Linux進(jìn)程調(diào)度器

    Linux操作系統(tǒng)作為一個(gè)開(kāi)源且廣泛應(yīng)用的操作系統(tǒng),其內(nèi)核設(shè)計(jì)包含了許多核心功能,而進(jìn)程調(diào)度器(Scheduler)就是其中一個(gè)至關(guān)重要的模塊。進(jìn)程調(diào)度器負(fù)責(zé)決定在任何給定的時(shí)刻哪個(gè)進(jìn)程
    的頭像 發(fā)表于 08-13 13:36 ?1131次閱讀
    深入探討<b class='flag-5'>Linux</b>的<b class='flag-5'>進(jìn)程</b>調(diào)度器

    玩轉(zhuǎn)RT-Thread之消息隊(duì)列的應(yīng)用

    在嵌入式系統(tǒng)開(kāi)發(fā)中,實(shí)時(shí)處理串口和ADC數(shù)據(jù)是一項(xiàng)重要的任務(wù)。本文將介紹如何在RT-Thread實(shí)時(shí)操作系統(tǒng)中,利用消息隊(duì)列來(lái)同時(shí)處理來(lái)自串口和ADC的數(shù)據(jù)。通過(guò)這種方法,我們能夠高效地管理和處理
    的頭像 發(fā)表于 07-23 08:11 ?795次閱讀
    玩轉(zhuǎn)RT-Thread之消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用