在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux下進程通訊消息隊列

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-08-19 19:56 ? 次閱讀

Linux下進程通訊消息隊列

?MQ(message queue),從字面意思上看,本質是個隊列,FIFO 先入先出,只不過隊列中存放的內容是message 而已。MQ 是在消息的傳輸過程中保存消息的容器。多用于分布式系統之間進行通信

消息隊列與 FIFO 很相似,都是一個隊列結構,都可以有多個進程往隊列里面寫信息,多個進程從隊列中讀取信息。

1.查看消息隊列命令

??1.查看消息隊列:ipcs -q

[wbyq@wbyq ~]$ ipcs -q

--------- 消息隊列 -----------
鍵        msqid      擁有者  權限     已用字節數 消息      
0xb8104ad9 1          wbyq       644        0            0           
0xd2350093 2          wbyq       666        208          2  

??2.查看消息隊列限制信息:ipcs -lq

[wbyq@wbyq ~]$ ipcs -lq

---------- 消息限制 -----------
系統最大隊列數量 = 32000
最大消息尺寸 (字節) = 8192
默認的隊列最大尺寸 (字節) = 16384

??3.查看消息隊列詳細信息:ipcs -q -i

[wbyq@wbyq ~]$ ipcs -q -i 2

消息隊列 msqid=2
uid=1000	gid=1000	cuid=1000	cgid=1000	模式=0666
cbytes=208	qbytes=16384	qnum=2	lspid=10177	lrpid=10175
發送時間=Thu Apr 28 11:56:08 2022  
接收時間=Thu Apr 28 11:56:08 2022  
更改時間=Thu Apr 28 11:49:04 2022  

??4.創建消息隊列:ipcmk -Q

[wbyq@wbyq ~]$ ipcmk -Q
消息隊列 id:4
[wbyq@wbyq ~]$ ipcs -q

--------- 消息隊列 -----------
鍵        msqid      擁有者  權限     已用字節數 消息      
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
--------- 消息隊列 -----------
鍵        msqid      擁有者  權限     已用字節數 消息      
0xb8104ad9 1          wbyq       644        0            0           
0xd2350093 2          wbyq       666        208          2    

2.相關函數

#include 
#include 
#include 
int msgget(key_t key, int msgflg);
函數功能:創建消息隊列
形參:key 鍵值,ftok產生
? ? ?msgflg?標志 IPC_CREAT|0666
返回值:失敗返回-1,成功返回msqid
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
函數功能: 將消息添加到隊列中
形參:msqid msgget函數返回值
???msgp 消息內容數據,一般以結構體類型填充
??????struct msgbuf {
????????????long mtype; /* 消息類型, 必須 > 0 */
????????????char mtext[1]; /消息數據/
????????????};
??????注意:struct msgbuf必須自己重寫,第一個參數long mtype必須指定,且>0,其他類型自定義
???msgsz 消息字節數,大小為:sizeof(struct msgbuf)-sizeof(mtype);
???msgflg 0當隊列滿時阻塞,直到消息寫入成功
??????IPC_NOWAIT 當隊列滿時不阻塞,立刻返回
??????IPC_NOERROR 若發送的消息大于 size 字節,則把該消息截斷,截斷部分將被丟棄,且不通知發送進程。
返回值:成功返回0,失敗返回-1;
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
函數功能:從隊列中取出消息
形參:msqid msgget函數返回值
???msgp 存放讀取到的消息內容
???msgsz 消息字節數,大小為:sizeof(struct msgbuf)-sizeof(mtype);
???msgtyp 消息類型:
???????>0 接收對列中的第 1 個類型等于 msgtyp 的消息
???????==0 取出消息隊列中的第一條消息
???????<0 接收其類型小于或等于 msgtyp 絕對值的第 1 個最低類型消息
???msgflg 0 當隊列空時阻塞,或者消息類型不匹配時阻塞
?????? IPC_NOWAIT 不阻塞,立刻返回
?????? IPC_NOERROR 若發送的消息大于 size 字節,則把該消息截斷,截斷部分將被丟棄,且不通知發送進程。
返回值:成功返回讀取的字節數,失敗返回-1;
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
函數功能:控制函數
形參:msqid msgget函數返回值
???cmd 通常為 IPC_RMID 表示刪除消息隊列。
當刪除消息隊列時,則buf填NULL即可;

3.示例

??(1)創建消息隊列,添加消息到隊列

#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 <消息類型> <消息數據> <消息內容>\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);//創建消息隊列
	if(msqid==-1)
	{
		printf("創建消息隊列失敗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]);//消息數據
	strcpy(msg.buff,argv[3]);//消息內容
	int msg_size=sizeof(msg)-sizeof(long);//消息大小,總大小-消息類型大小
	/*添加消息到隊列*/
	int size=msgsnd(msqid,&msg,msg_size,0);
	if(size==-1)
	{
		printf("寫入消息失敗err=%s\n",strerror(errno));
	}
	else printf("消息寫入成功\n");
	return 0;
}  

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

#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);//創建消息隊列
	if(msqid==-1)
	{
		printf("創建消息隊列失敗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]);//要寫讀取的消息類型
	//從消息隊列中取數據
	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)運行效果

pYYBAGL_eXuABxWmAAeJ5O7XsAY981.png#pic_center


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11419

    瀏覽量

    212268
  • IPC
    IPC
    +關注

    關注

    3

    文章

    359

    瀏覽量

    52681
  • 進程
    +關注

    關注

    0

    文章

    206

    瀏覽量

    14179
收藏 0人收藏

    評論

    相關推薦

    Linux后臺進程管理詳解

    當我們在終端或控制臺工作時,可能不希望由于運行一個作業而占住了屏幕,因為可能還有更重要的事情要做,比如閱讀電子郵件。對于密集訪問磁盤的進程,我們更希望它能夠在每天的非負荷高峰時間段運行(例如凌晨)。為了使這些進程能夠在后臺運行,也就是說不在終端屏幕上運行,有幾種選擇方法可
    的頭像 發表于 04-25 11:04 ?97次閱讀
    <b class='flag-5'>Linux</b>后臺<b class='flag-5'>進程</b>管理詳解

    Linux系統進程管理入門指南

    Linux 系統中,進程是正在運行的程序的實例。理解進程的管理、查看和控制對于系統管理員和開發者來說非常重要
    的頭像 發表于 04-22 14:34 ?155次閱讀
    <b class='flag-5'>Linux</b>系統<b class='flag-5'>進程</b>管理入門指南

    LinuxVim編輯器的使用技巧

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

    Linux進程狀態詳解

    進程狀態是task_struct內的一個整數;進行:進程在調度隊列中,進程的狀態都是running,阻塞:等待某種設備或者資源就緒。進程是一
    的頭像 發表于 04-01 09:46 ?173次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b>狀態詳解

    中興通訊亮相2025年世界移動通信大會

    近日,中興通訊攜全隊列多形態AI終端亮相世界移動通信大會(MWC25巴塞羅那),為全球用戶帶來全場景AI體驗。
    的頭像 發表于 03-10 10:12 ?484次閱讀

    Linux計劃任務cron詳解

    cron是linux用來周期性的執行某種任務或等待處理某些事件的一個守護進程,與windows的計劃任務類似,當安裝完成操作系統后,默認會安裝此服務 工具,并且會自動啟動crond
    的頭像 發表于 02-07 15:31 ?521次閱讀
    <b class='flag-5'>Linux</b>計劃任務cron詳解

    深入解析Linux程序與進程

    什么是程序 一組計算機能識別和執行的指令,用于指導計算機執行特定任務或解決特定問題。程序通常由代碼、數據和資源文件組成,涉及語法、算法和數據結構。為二進制文件 什么是進程 是一個具有獨立功能的程序
    的頭像 發表于 12-18 11:01 ?339次閱讀
    深入解析<b class='flag-5'>Linux</b>程序與<b class='flag-5'>進程</b>

    Linux之CPU調度策略和CPU親和性

    一、調度策略 調度進程 單個 CPU一次只能執行一個進程,雖然 Linux 系統通過使用多任務同時處理多個進程,但當多個進程同時運行在一個C
    的頭像 發表于 12-05 16:38 ?909次閱讀
    <b class='flag-5'>Linux</b>之CPU調度策略和CPU親和性

    JavaWeb消息隊列使用指南

    用程序的通信方法,允許異步傳輸消息,并且具有存儲和轉發消息的能力。它主要解決以下問題: 異步處理 :允許系統組件異步處理任務,提高響應速度。 解耦系統 :不同系統組件之間通過消息隊列通信,降低耦合度。 流量削峰 :在高流量情況,消息
    的頭像 發表于 11-25 09:27 ?359次閱讀

    深入Linux進程管理:提升效率與穩定性的關鍵方法

    目錄 Linux進程管理 8.1 IO負載 8.2 實時進程監控 5.1 作業與會話 5.2 作業分類 4.1 ps 4.2pstree 4.3pgrep 4.4pidof 4.5 vmstat
    的頭像 發表于 11-22 11:05 ?605次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>進程</b>管理:提升效率與穩定性的關鍵方法

    一文搞懂Linux進程的睡眠和喚醒

    ): 進程在等待某個條件滿足(如I/O操作),可以被信號喚醒。 Linux通過內核提供的系統調用來控制進程的睡眠。常用的系統調用有: sleep(): 使進程暫停指定的秒數。 usl
    發表于 11-04 15:15

    Linux用戶身份與進程權限詳解

    在學習 Linux 系統權限相關的主題時,我們首先關注的基本都是文件的 ugo 權限。ugo 權限信息是文件的屬性,它指明了用戶與文件之間的關系。但是真正操作文件的卻是進程,也就是說用戶所擁有的文件
    的頭像 發表于 10-23 11:41 ?631次閱讀
    <b class='flag-5'>Linux</b>用戶身份與<b class='flag-5'>進程</b>權限詳解

    嵌入式環形隊列與消息隊列的實現原理

    嵌入式環形隊列,也稱為環形緩沖區或循環隊列,是一種先進先出(FIFO)的數據結構,用于在固定大小的存儲區域中高效地存儲和訪問數據。其主要特點包括固定大小的數組和兩個指針(頭指針和尾指針),分別指向隊列的起始位置和結束位置。
    的頭像 發表于 09-02 15:29 ?966次閱讀

    深入探討Linux進程調度器

    Linux操作系統作為一個開源且廣泛應用的操作系統,其內核設計包含了許多核心功能,而進程調度器(Scheduler)就是其中一個至關重要的模塊。進程調度器負責決定在任何給定的時刻哪個進程
    的頭像 發表于 08-13 13:36 ?1117次閱讀
    深入探討<b class='flag-5'>Linux</b>的<b class='flag-5'>進程</b>調度器

    玩轉RT-Thread之消息隊列的應用

    在嵌入式系統開發中,實時處理串口和ADC數據是一項重要的任務。本文將介紹如何在RT-Thread實時操作系統中,利用消息隊列來同時處理來自串口和ADC的數據。通過這種方法,我們能夠高效地管理和處理
    的頭像 發表于 07-23 08:11 ?788次閱讀
    玩轉RT-Thread之消息<b class='flag-5'>隊列</b>的應用
    主站蜘蛛池模板: 手机福利在线观看 | aaaa在线观看 | 性性性性bbbbxxxx | 欧美日韩中文字幕在线 | 国产成人精品怡红院 | 中国videos偷窥 | 久久成人性色生活片 | 男人视频网站 | 国产午夜精品久久久久九九 | 色狠狠狠色噜噜噜综合网 | 天堂资源在线最新版 | 国产精品bdsm在线调教 | 俺去在线 | 欧美一级乱理片免费观看 | 国产精品 色 | 亚洲天天做日日做天天欢毛片 | 国产成人高清一区二区私人 | 李老汉的性生生活2 | 香港日本三级在线播放 | 操女人网址 | 天天射天天干天天插 | 色老头成人免费综合视频 | 亚洲一区二区三区在线网站 | 98色花堂永久地址国产精品 | 美女扒开尿口给男人看大全 | 黄色三级免费网站 | 天天透天天干 | 欧美三级视频网 | 97综合久久 | 午夜精品久久久久久 | 成人欧美精品久久久久影院 | 69视屏| 天堂在线最新资源 | 三级www| 亚洲四虎永久在线播放 | 国产精品视频永久免费播放 | 一级做a爰片久久毛片图片 一级做a爰片久久毛片鸭王 | 久久男人的天堂色偷偷 | 男人透女人超爽视频免费 | 国产精品国产三级国快看 | 色色视频免费网 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品