linux 消息队列_Linux进程间通信第六讲 标准IPC之消息队列

10d2ae6b7944429fb7b603785f8045c3.png

来源CSDN:

CSDN-专业IT技术社区-登录​blog.csdn.net

一、概念和原理

消息队列是另一种标准IPC,当然也大概遵循大部分标准

消息队列,它是存放消息(数据)的队列,而队列是先进先出的线性数据结构

换句话说,我们就是利用这个数据结构 进行进程间的通信

消息队列允许多个进程同时读写消息.由于消息可以定义很多类型,取出时可以指定哪个消息类型取出,所以消息队列解决了共享内存多个进程同时读写时数据混乱的问题,只要把消息标定不同的类型即可

二、使用

1)通过ftok获取key

2)通过key 创建/获取 消息队列 ------- msgget

参数:

key - 上一步获取的key

msgflg - 创建标志和权限

IPC_CREAT|0666

成功返回消息队列ID,失败返回-1

3)把消息 存入队列 / 从队列中取出 ----------- msgsnd/msgrcv

31bdb4c798137ae8ec45b8436ad00d02.png
         参数:msqid - 消息队列IDmsgq - 消息首地址msgsz - 消息长度(消息数据的长度)msgtyp - 用来指定接收什么类型的消息(仅仅接收消息时才有)0:接收任意类型消息(第一个,先进先出)>0:接收类型为msgtyp的特定消息<0:接收类型 小于等于 msgtyp绝对值的小,类型从小到大接收msgflg - 接收/发送 标识0表示阻塞方式操作,接收消息没有消息可接收/发送消息消息队列满了 就会等待直到成功IPC_NOWAIT表示非阻塞方式操作,接收消息没有消息可接收/发送消息消息队列满了 直接返回错误

msgsnd成功返回0,msgrcv成功返回收到消息的消息数据长度,失败都返回-1

另外,消息类型在系统中是未定义的,所以程序员需要在代码中自己定义消息的类型,但是必须按照以下形式:

    struct msgbuf {long mtype;       /* 消息类型, 必须大于0 */char mtext[1];    /* 消息数据, 即存放的数据 */};

4)不再使用可以删除消息队列 ------- msgctl

fa6ea421ab711386005a3cbb4b16f638.png
     参数:msqid - 消息队列IDcmd - 命令IPC_RMID:删除IPC_SET:  修改IPC_STAT:   获取buf - 设置/获取 时 传入/传出 消息队列的信息, 下面是它的数据类型 ,其中可以修改的是uid、gid和mode

msgctl函数成功返回0,失败返回-1

struct msqid_ds {struct ipc_perm msg_perm;     /* Ownership and permissions */time_t          msg_stime;    /* 最后发送消息时间 */time_t          msg_rtime;    /* 最后接收消息时间 */time_t          msg_ctime;    /* 最后修改时间 */unsigned long   __msg_cbytes; /* 当前使用消息队列空间大小 (nonstandard) */msgqnum_t       msg_qnum;     /* 当前消息个数 */msglen_t        msg_qbytes;   /* 消息队列最大长度 */pid_t           msg_lspid;    /* 最后发送消息的PID */pid_t           msg_lrpid;    /* 最后接收消息的PID */};struct ipc_perm {key_t          __key;       /* Key supplied to msgget(2) */uid_t          uid;         /* Effective UID of owner */gid_t          gid;         /* Effective GID of owner */uid_t          cuid;        /* Effective UID of creator */gid_t          cgid;        /* Effective GID of creator */unsigned short mode;        /* Permissions */unsigned short __seq;       /* Sequence number */};

消息队列发送端代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>struct MSG{long mtype;char mtext[100];
};int main()
{//1.获取keykey_t key = ftok(".",'x');if(key==-1){perror("ftok");exit(-1);}//2.创建消息队列int msqid = msgget(key,IPC_CREAT|0666);if(msqid==-1){perror("shmget");exit(-1);}//3.发送消息struct MSG msg1;msg1.mtype = 1;//类型1strcpy(msg1.mtext,"liubei");int res = msgsnd(msqid,&msg1,sizeof(msg1.mtext),0);if(res==-1){perror("msgsnd");exit(-1);}msg1.mtype = 2;//类型2strcpy(msg1.mtext,"guanyu");res = msgsnd(msqid,&msg1,sizeof(msg1.mtext),0);if(res==-1){perror("msgsnd");exit(-1);}printf("消息发送成功!n");return 0;
}

消息队列接收端代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>extern int errno;struct MSG{long mtype;char mtext[100];
};int main()
{//1.获取keykey_t key = ftok(".",'x');if(key==-1){perror("ftok");exit(-1);}//2.获取消息队列int msqid = msgget(key,0);if(msqid==-1){perror("shmget");exit(-1);}//3.接收消息struct MSG msg1;while(1){//类型-2,方式非阻塞int res = msgrcv(msqid,&msg1,sizeof(msg1.mtext),/*-2*/0,IPC_NOWAIT);//接收完成删除消息队列if(res==-1&&errno==ENOMSG){break;}else if(res==-1&&errno!=ENOMSG){perror("msgrcv");exit(-1);}else{printf("消息类型 = %ld,消息内容 = %sn",msg1.mtype,msg1.mtext);}}msgctl(msqid,IPC_RMID,0);printf("消息队列删除成功!n");return 0;
}

输出如下:

liaowenbindeMacBook-Pro:3 liaowenbin$ ./4msg 
消息发送成功!
liaowenbindeMacBook-Pro:3 liaowenbin$ gcc 5msg.c -o 5msg
liaowenbindeMacBook-Pro:3 liaowenbin$ ./5msg 
消息类型 = 1,消息内容 = liubei
消息类型 = 2,消息内容 = guanyu
消息队列删除成功!

212c745e067bc4159a3333e349d261f9.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15个只有数学老师懂的泪流满面瞬间

全世界只有3.14 % 的人关注了爆炸吧知识「1」大题算了半天&#xff0c;就是跟标准答案对不上「2」一次令人期待的公开课啊啊——啊...「3」这就是传说中美好的协同教研「4」在网上下了一堆 PPT 准备拼到一起「5」预测高考题「6」临下课了还有三道大题没评讲「7」当我以为我已经…

matlab绘制二元一次函数图像_【八上数学】 一次函数必考知识点(下)

【八上数学】《一次函数》必考知识点(中)【八上数学】《函数、一次函数》必考知识点(上)写在前面本讲&#xff0c;我们重点研究一次函数与一元一次方程&#xff0c;不等式&#xff0c;二元一次方程组的问题&#xff0c;帮助同学们解决一些典型问题&#xff0e;一、一次函数与二…

计算机能代替纸笔英语作文,电脑能代替纸笔吗英语作文

电脑能代替纸笔吗英语作文在现实生活或工作学习中&#xff0c;说到作文&#xff0c;大家肯定都不陌生吧&#xff0c;作文可分为小学作文、中学作文、大学作文(论文)。作文的注意事项有许多&#xff0c;你确定会写吗&#xff1f;以下是小编为大家整理的电脑能代替纸笔吗英语作文…

《WinForm开发系列之高级篇》Item2 TCP异步传输

1.AsySocket.cs 代码 publicclassAsySocket {#region私有字段privateSocket mSocket null;privatestringmID "";#endregion#region构造函数publicAsySocket(string_LocalIP, int_LocalPort) { try{ mSocket newSocket(AddressFamily.InterNetwork, SocketType.Stream…

C# params的用法详解

为了将方法声明为可以接受可变数量参数的方法&#xff0c;我们可以使用params关键字来声明数组,要求&#xff1a;(1)在方法声明中的 params 关键字之后不允许任何其他参数&#xff0c;并且在方法声明中只允许一个 params 关键字。(2)该参数必须标识一个一维数组&#xff0c;但类…

spring 单例 获取多例的位_Spring系列第6篇:玩转bean scope,避免跳坑里!

公众号关注“程序员二哥”&#xff0c;设为‘星标’&#xff0c;带你学习更多的知识。本文内容 详细介绍5中bean的sope及使用注意点自定义作用域的实现应用中&#xff0c;有时候我们需要一个对象在整个应用中只有一个&#xff0c;有些对象希望每次使用的时候都重新创建一个&…

女生的拳头有多厉害?

1 天下武功唯快不破2 狗子&#xff1a;没想到我有这种天赋3 哈哈哈还是你社会啊4 女生的拳头有多厉害&#xff1f;?5 怎么解开的&#xff1f;6 心中有海&#xff0c;脚下有沙&#xff0c;这就是马尔代夫7 你的人生概括

与ln的指数转化公式_高考数学48条秒杀型公式与方法

点上方蓝字&#xff0c;关注“云学冠学习资讯”有助于提高成绩哦&#xff01;除了课本上的常规公式之外&#xff0c;掌握一些必备的秒杀型公式能够帮你在考试的时候节省大量的时间&#xff0c;师姐这次的分享就是48条秒杀公式&#xff0c;直接往下看&#xff01;1.适用条件&…

在C#2.0中使用Nullable可空类型

在C#1.x的版本中&#xff0c;一个值类型变量是不可以被赋予null值的&#xff0c;否则会产生异常。在C#2.0中&#xff0c;微软提供了Nullable类型&#xff0c;允许用它定义包含null值&#xff08;即空值&#xff09;的数据类型&#xff0c;这对处理数据库中包含可选字段以及很多…

豆瓣9.7,这些舍不得看完的神剧,看一集少一集!我刷了一晚上……

全世界只有3.14 % 的人关注了爆炸吧知识今天给大家介绍一位好朋友——小樱&#xff0c;小樱&#xff0c;作为资深美剧迷英语博主&#xff0c;收藏了很多经典美剧、动画资源&#xff0c;每天还会和大家分享新鲜有趣的英语知识。喜欢看美剧追动画和立志学好英语的小伙伴千万别错过…

C#编码规范

1、连接数据库并返回DataTable View Code public DataTable GetDataByTable() { DataSet dataset new DataSet(); DataTable datatable null; SqlConnection sqlConnection new SqlConnection("Data Source.;Initial CatalogCalamity_Dat…

api中文文档 mws_中英文排版规范化 API

此文章对开放数据接口 API 之「中英文排版规范化 API」进行了功能介绍、使用场景介绍以及调用方法的说明&#xff0c;供用户在使用数据接口时参考之用。 1. 产品功能此次开放了中英文排版规范化在线接口&#xff0c;用于自动中英文排版、标点符号格式化&#xff0c;中英混排格式…

计算机管理无法连接虚拟磁盘服务,虚拟磁盘服务错误怎么操作【图文教程】

虚拟磁盘我们大家都可以看到但实际上是不存在的&#xff0c;虚拟的就是假的。虚拟磁盘是通过将一些网络文件或是内存利用科技手段伪造成磁盘&#xff0c;我们通常称它为虚拟磁盘。虚拟磁盘可以给内存增加容量&#xff0c;可以加快磁盘数据交换&#xff0c;提高计算机运行速度。…

记一次 .NET 某机械臂智能机器人控制系统MRS CPU爆高分析

一&#xff1a;背景 1. 讲故事这是6月中旬一位朋友加wx求助dump的故事&#xff0c;他的程序 cpu爆高➕UI卡死&#xff0c;问如何解决&#xff0c;截图如下&#xff1a;在拿到这个dump后&#xff0c;我发现这是一个关于机械臂的MRS程序&#xff0c;哈哈&#xff0c;在机械臂这种…

linux 信号_Linux中的信号处理机制 [四]

信号与线程Unix的信号机制在诞生之初&#xff0c;生活在只有进程(process)的相对单纯的环境中。自从Unix世界有了线程(thread)的概念&#xff0c;信号就被赋予了发往进程中某个特定线程的能力&#xff0c;当然&#xff0c;这也增加了整个信号机制实现的复杂度。本系列的前面三篇…

HP NIC Teaming技术探讨

NIC Teaming技术将2个或更多个网卡(HP NIC Teaming最多可达8个)捆绑在一起使用&#xff0c;以达到增加总的带宽(Load Balance&#xff0c;负载均衡)或者线路容错(Fault Tolerance)的目的。由2个或多个网卡组成一个逻辑网络端口Teamport&#xff0c;IP地址和网络设置绑定在这个逻…

仙居(一)

仙居&#xff08;一&#xff09; 仙居——仙人居住的地方。 景星岩全景 (看大图请点击) 其他图片在整理中&#xff0c;待我慢慢把图片和故事都理出来。转载于:https://www.cnblogs.com/hzy5901/archive/2011/03/31/5871611.html

我的电脑不联网,很安全!黑客:你还有风扇呢

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;机器之心参与&#xff1a;张倩、蛋酱、杜伟从1988年第一个网络蠕虫病毒诞生以来&#xff0c;「互联网危机四伏」的观念就已经深入人心。如果只是这样&#xff0c;不给电脑联网、禁止使用任何可移动储存介质&#xff0c;数…

移动终端测试进化论

2019独角兽企业重金招聘Python工程师标准>>> 移动终端测试进化论 本案例主要以5年的现身经历&#xff0c;阐述针对移动互联网终端测试&#xff0c;从最基础的原始时代如何进入到现代化时代&#xff1b;从单一到多点密集&#xff1b;从对产品的质量保障进化到对产品信…

计算机视觉领域还有那些坑,深度学习/计算机视觉常见的8个错误总结及避坑指南...

人类并不是完美的&#xff0c;我们经常在编写软件的时候犯错误。有时这些错误很容易找到&#xff1a;你的代码根本不工作&#xff0c;你的应用程序会崩溃。但有些 bug 是隐藏的&#xff0c;很难发现&#xff0c;这使它们更加危险。在处理深度学习问题时&#xff0c;由于某些不确…