国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取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
    +關注

    關注

    88

    文章

    11746

    瀏覽量

    218846
  • IPC
    IPC
    +關注

    關注

    3

    文章

    377

    瀏覽量

    54803
  • 進程
    +關注

    關注

    0

    文章

    211

    瀏覽量

    14514
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux進程管理不用愁!這6個工具幫你搞定90%場景

    Linux 系統中,進程是資源分配的基本單位,無論是服務器運維、程序調試還是日常使用,掌握進程管理工具都是必備技能。今天就帶大家梳理 6 個最常用的進程管理工具,從查看
    的頭像 發表于 02-04 16:23 ?1008次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b>管理不用愁!這6個工具幫你搞定90%場景

    Linux進程樹分析工具pstree詳解與實戰指南(另一視角優化Linux系統)

    Linux 系統開發與運維中,理解進程的運行狀態和相互關系是排查問題、優化性能的基礎。pstree 作為一款輕量高效的進程樹可視化工具,能直觀展示系統中所有進程的父子關系,為系統分
    的頭像 發表于 02-04 16:21 ?688次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b>樹分析工具pstree詳解與實戰指南(另一視角優化<b class='flag-5'>Linux</b>系統)

    RDMA設計24:隊列管理模塊設計

    隊列管理模塊采用管理與存儲分離的結構進行設計,由發送隊列存儲、發送隊列管理、接收隊列管理、完成條目解析、異常完成條目處理和 Round-Robin 仲裁組成。
    的頭像 發表于 01-20 11:45 ?1198次閱讀
    RDMA設計24:<b class='flag-5'>隊列</b>管理模塊設計

    進程通信

    直接把消息發送給接收進程,并將它掛在接收進程的消息緩沖隊列上,接收進程從消息緩沖隊列中取得消息。   2) 間接通信方式:發送
    發表于 01-15 06:16

    進程的控制

    、初始化處理機狀態信息和初始化處理機控制信息,以及設置進程的優先級等。   4. 如果進程就緒隊列能夠接納新進程,就將新進程插入到就緒
    發表于 01-15 06:05

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】Linux內核開發基礎

    隊列中的元素就是正在睡眠且等待被喚醒的進程 內核中的簡單睡眠 簡單睡眠也被稱為被動睡眠,任務會在等待時進入睡眠狀態,源碼中usleep_range()、msleep
    發表于 01-12 22:45

    深入Linux內核:進程調度的核心邏輯與實現細節

    Linux系統中,進程調度就像一位精明的“CPU管理員”——它決定著哪個進程能優先使用CPU,多久切換一次進程,如何平衡系統響應速度與資源利用率。小到桌面應用的流暢點擊,大到服務器的
    的頭像 發表于 12-24 07:05 ?3963次閱讀
    深入<b class='flag-5'>Linux</b>內核:<b class='flag-5'>進程</b>調度的核心邏輯與實現細節

    解析Linux進程、線程和協程

    進程間通信(IPC):Linux提供了多種IPC機制,如管道、信號、共享內存和消息隊列,用于進程之間的通信。 線程管理 在Linux中,線
    發表于 12-22 11:00

    Linux進程間通信(IPC)全解析:從管道到?Socket,一篇講透

    在?Linux?世界里,進程并非孤立存在。無論是后臺服務協作(如?Web?服務器與數據庫)、命令行工具聯動(如ps | grep),還是復雜應用的模塊通信,都離不開 進程間通信(IPC
    的頭像 發表于 11-14 21:38 ?1.3w次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進程</b>間通信(IPC)全解析:從管道到?Socket,一篇講透

    基于環形隊列的UART收發回顯實驗

    在實際項目開發中,由于有些串口不具備FIFO(如SCI1和SCI2)或FIFO的buffer比較小,這可能會在數據處理速度小于數據接收速度的時候,導致數據的丟失。因此我們可以設計一個隊列來避免這一
    的頭像 發表于 10-27 13:51 ?1958次閱讀
    基于環形<b class='flag-5'>隊列</b>的UART收發回顯實驗

    【HZ-T536開發板免費體驗】—— linux 進程創建

    Linux進程通信方式有這幾種: 1。管道 2。信號量 3。消息隊列 4。共享內存 在本帖子中,我會講解fork(),exit()系統調用的實踐。通過應用編程來實現系統調用。 1,進程
    發表于 09-01 20:49

    NVME控制器之隊列管理模塊

    隊列管理模塊是整個NVMe Host控制器的核心模塊,該模塊實現了提交隊列與完成隊列的管理,多隊列請求的仲裁判決等功能。隊列管理模塊中含有數
    的頭像 發表于 05-03 15:32 ?616次閱讀
    NVME控制器之<b class='flag-5'>隊列</b>管理模塊

    Linux后臺進程管理詳解

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

    Linux系統進程管理入門指南

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

    Linux進程狀態詳解

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