ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux消息队列

2021-01-13 13:01:27  阅读:181  来源: 互联网

标签:队列 msgid int 消息 key Linux include mtext


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Linux消息队列是什么?

示例:消息队列的本质是消息的链表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
接收进程可以独立地接收含有不同类型的数据结构。

二、使用步骤

1.引入库

int msgget(key_t key, int msgflg); 
创建消息队列 , 返回值为该队列号
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
发送消息
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
接受信息,msgtyp需要指明接受的数据type
key_t ftok(const char *pathname, int proj_id);
为队列随机附加key,pathename为路径,id号可随意(1-255)
int msgctl(int msqid, int cmd, struct msqid_ds *buf);//可用于消除内内核中的队列

代码如下(示例):

//发送及接受数据程序
#include<stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<string.h>
 struct msgbuf {
		long mtype;       /* message type, must be > 0 */
        char mtext[128];    /* message data */
 };
int main()
{
    
    struct msgbuf snddata={888,"hello rcv,this is snd"};
	struct msgbuf readdata;
	key_t key;
	key = ftok(".",2);
	int msgid = msgget(key,IPC_CREAT|0777);
	printf("the key is %x\n",key);
	if(msgid == -1)
	{
		printf("creat fail\n");
	}
	else
	{
			msgsnd(msgid,&snddata,strlen(snddata.mtext),0);
			msgrcv(msgid,&readdata,sizeof(readdata.mtext),988,0);
			printf("the data come form read:%s\n",readdata.mtext);
	}
	msgctl(msgid,IPC_RMID,NULL);//销毁msgid为标识符的消息队列
		return 0;
}

//接受及发送数据程序
#include<stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<string.h>
 struct msgbuf {
		long mtype;       /* message type, must be > 0 */
        char mtext[128];    /* message data */
 };
int main()
{
    
	struct msgbuf snddata={988,"the data come from rcv"};
	struct msgbuf readdata;
	key_t key;
	key=ftok(".",2);
	int msgid = msgget(key,IPC_CREAT|0777);
	printf("the key is %x\n",key);
	if(msgid ==-1)
    {
		printf("creat fail\n");
    }
	else
	{
			msgrcv(msgid,&readdata,sizeof(readdata.mtext),888,0);
			printf("the data come snd:%s ",readdata.mtext);
			msgsnd(msgid,&snddata,strlen(snddata.mtext),0);
	}
	msgctl(msgid,IPC_RMID,NULL);//销毁msgid为标识符的消息队列
		return 0;
}


2.相关

ls -i  打印索引结点
消息队列一旦创建,仲裁权便移交给Linux内核,除非销毁,否则存在
数据一旦写入,读出后数据研究存在


总结

消息队列虽然解决了管道中读写端的控制,但容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。

标签:队列,msgid,int,消息,key,Linux,include,mtext
来源: https://blog.csdn.net/weixin_46364330/article/details/112556200

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有