Linux进程通信之消息队列

news2024/11/30 13:48:01

目录

1.消息队列的原理:

2.消息队列的接口:

        (1)创建消息队列

        (2)向消息队列发送消息

        (3)接收消息

         (4)操作消息队列的接口


1.消息队列的原理:

消息队列(messagequeue)以链表作为基础,实现消息队列,由操作系统维护该链表

操作系统中,使用消息队列描述符(qid)来区分每个消息队列(qid是唯一的)

进程在消息队列的末尾增加消息,需要信息的进程按照所需的类型在队列中取消息

2.消息队列的接口:

(1)创建消息队列

        int megget(key_t,int msgflg)

参数: 

key:消息队列的标识符

megflg:创建的标志,如IPC_CREAT

IPC_CREAT :如果不存在就创建,按位或上一个权限

返回值:

成功:返回队列ID

失败:返回-1,并设置erron 

2)向消息队列发送消息      

 

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg)

参数:

msqid:消息队列的ID

msgp:指向msgbuf的指针,用来发送指定的消息,在写msgsnd、msgrev函数时,要提前定义该结构体,主要是指定mtext大小。

      msgp指向的msgbuf为发送的结构体,操作系统指定了函数发送消息的格式,只定义了一部分,mtext可以由程序员自己改变。

 msgsz:要发送的消息的长度,该参数的值不是表示msgp指向的msgbuf结构体的大小,而是该结构体中mtext的大小。

msgflg:创建标记,如果指定了IPC_NOWAIT,失败会立即返回。       

         0:阻塞发送

         IPC_NOWAIT:非阻塞发送

返回值:

        0:成功

        -1:失败,并设置errno

(3)接收消息

ssize_t msgrcv(int msqid , void *msgp,size_t msgsz,long msgtyp,int msgflg)

参数:

msgid:消息队列的ID

msgp:指向msgbuf的指针,用来接收消息

**struct  msgbuf{……}为输出型参数

msgsz:需要接受的消息的长度,注意msgsz是由msgp所指向的结构体的成员 mtext的最大大小决定的(byte)

msgtyp有三种形式:

        1.msgtyp=0:读取队列的第一个消息

        2.msgtyp>0:读取队列类型为msgtyp的第一条消息,除非在msgflg中指定了 MSG_EXCEPT,否则将读取类型不等于 megtyp的队列中的第一条消息,

        3.msgtyp<0:读取队列中最小类型小于或等于msgtyp绝对值的第一条消息

msgflg:创建标记,若指定了IPC_NOWAIT,获取失败后就直接返回 

     (4)操作消息队列的接口

int msgctl(int msqid , int cmd, struct msqid_ds *buf)

参数:

        msqid:消息队列的ID

        cmd:控制命令:

                IPC_RMID,删除命令

                IPC_STAT,获取命令

        buf:存储队列的相关信息的buf

返回值:

        成功:根据不同的cmd有不同的返回值

        失败: 返回-1,并设置errno

5.代码实现:

写端发送消息,读端从队列读取

mesgrcv:

#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>
#include<sys/ipc.h>

struct msgbuf
{
   long mtype;
   char mtext[1024];

};


int main()
{
 int msg_id=msgget(0x06060606,IPC_CREAT|0664);
 if(msg_id<0 )
{
 perror("msgget \n" );
return 0;
}

printf("msggqueued id is %d\n",msg_id );
struct msgbuf mq;
msgrcv(msg_id,&mq,sizeof(mq.mtext),1,0);
printf("接受的消息:%s \n",mq.mtext);

return 0;
}

msgsnd:

#include<stdio.h>
#include<unistd.h>
#include<sys/msg.h>

struct msgbuf
{
     long mtype;        //message type
     char mtext[512];   //message data

};

int main()
{
 int msg_qid=msgget(0x06060606,IPC_CREAT|0664);
 if(msg_qid<0 )
  {
    perror("msgget\n");
  return 0;
  }

  struct msgbuf mq;

  int i;
  for(i=0;i<10;i++)
 {
   mq.mtype=i+1;
   sprintf(mq.mtext,"%s,%d ","xxxxxxxxxx ",i+1);
   msgsnd(msg_qid,&mq,sizeof(mq.mtext),0);
 }

return 0;
}

查看系统中的message queue:

 

 

当多次读出时,由于消息已经出了队列,所以不能再读出。

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

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

相关文章

docker 安装 Heimdall 导航页

前言 随着群晖中使用的功能越来越多&#xff0c;各种端口太多容易忘&#xff0c;所以就有了使用导航页的想法&#xff08;使用收藏夹的朋友除外&#xff09;。群晖也有自带的WEB套件管理&#xff0c;不过个人感觉相对麻烦&#xff0c;使用 Heimdall 导航页可以设置密码登录&am…

【数字信号调制】16QAM信号调制解调【含Matlab源码 2050期】

⛄一、QAM调制与解调&#xff08;附实验题目说明&#xff09; 1 引 言 数字振幅调制、数字频率调制和数字相位调制是数字调制的基础,然而,这3种数字调制方式都存在不足之处。如频谱利用率低、抗多径衰落能力差、功率谱衰减慢、带外辐射严重等。为了改善这些不足,几十年来人们不…

yocto machine class解析之st-partitions-image

yocto machine class解析之st-partitions-image stm32mp157 yocto的meta-st-stm32mp layer中提供了几个class,后续几篇文章重点分析这些class文件&#xff1a; 第一篇就从st-partitions-image.bbclass 开始&#xff0c;st所有创建image的bb文件都会引用st-partitions-image&am…

「UWB」精准定位黑科技,开启座舱雷达新蓝海

基于厘米级定位、超低功率、强抗干扰、超大容量等技术特点&#xff0c;UWB&#xff08;超宽带&#xff09;技术在消费电子、智能汽车等领域的应用前景被赋予厚望。 值得一提的是&#xff0c;利用UWB雷达还可实现舱内活体检测、脚踢尾箱等&#xff0c;这意味着新一轮座舱感知革…

【Vue】ref引用,插槽

一、ref 什么是ref&#xff1f; ref用来辅助开发者在不依赖于jQuery 的情况下&#xff0c;获取DOM元素或组件的引用。 每个vue的组件实例上&#xff0c;都包含一个$refs对象&#xff0c;里面存储着对应的DOM元素或组件的引用。默认情况下&#xff0c;组件的$refs 指向一个空对…

Ubuntu20.04下安装nvidia驱动

ubuntu-drivers devices会显示你的电脑上可用的nvidia驱动。只需要安装推荐的版本即可&#xff08;后面有recommend字样&#xff09; 打开电脑里的软件和更新app&#xff08;这里建议换提前换源&#xff0c;阿里源或者清华源&#xff09; 来到附加驱动这个页面&#xff0c;选…

HTML初识-概念和基本知识

1 . HTML初识-基础认知 HTML标签 1.1 目录 ◆ 基础认知 ◆ HTML标签学习 ◆ 综合案例 1.2 学习目标 ◆ 能够理解HTML的 基本语法 和标签的关系 ◆ 能够使用 排版标签 实现网页中标题、段落等效果 ◆ 能够使用 相对路径 选择不同目录下的文件 ◆ 能够使用 媒体标签 在网页中显示…

ES进阶教程

1.分片Shards 一个索引可以存储超出单个结点硬件限制的大量数据,es提供了将索引划分为多份的能力,每一份都称之为分片.当创建索引时,可以指定想要的分片数量.每个分片本身也是一个功能完善并且相对独立的索引.这个索引可以被放在集群中的任何结点上. 分片的重要性 1.允许水平切…

相控阵天线(九):平面阵列天线综合(不可分离型切比雪夫分布、圆口径泰勒综合、可分离型分布、配相抵消法)

目录简介不可分离型分布不可分离型切比雪夫圆口径泰勒综合可分离型分布可分离切比雪夫综合可分离泰勒综合平面阵列配相抵消法简介 按行、列排列的可分离型矩形平面阵&#xff0c;其阵因子是两个正交排列的直线阵阵因子的乘积。可分离的平面阵方向图在两个主面内是满足预期副瓣…

Docker创建Spring容器【方便服务迁移】

&#x1f4c3;目录跳转&#x1f4da;简介&#xff1a;&#x1f383; 1.上传jar包&#x1f389;2.创建Dockerfile文件&#x1f5fa;️3.生成容器&#x1f365;4.查看本地镜像&#x1f680;5.运行镜像&#x1f52d;6.使用工具访问接口&#x1f3c6;总结&#x1f4da;简介&#xf…

网上预约挂号系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

si9000 单端(线)差分(动)线板层结构与阻抗计算

常见的单端(线)阻抗计算模式&#xff1a; Surface Microstrip 1B 在下图(表面&#xff0c;或暴露&#xff0c;微带)信号线暴露(空气)和参考电源或接地平面。根据电介质相对于迹的排列(在迹的下方或上方)对结构进行分类。下图显示了在信号轨迹(指定为1B)以下使用单一介电层的表…

elasticsearch数据存储结构,springboot集成elasticsearch

一、数据存储结构 结合数据库的结构理解起来就会比较清楚&#xff1a; 1&#xff09;索引&#xff08;Index&#xff09;>数据库&#xff08;Database&#xff09;。 2&#xff09;类型&#xff08;Type&#xff09;>表&#xff08;Table&#xff09;。 3&#xff09;文档…

Ubuntu 20.04.05安装PCL-1.12.0

1、安装QT-5.9.9 链接: Ubuntu20.04安装、配置、使用、卸载QT5.9.9以及第一个编写QT程序. 或者 链接: 在ubuntu用命令安装和卸载qt4、qt5(亲测有效). 2、安装VTK-7.1.1PCL-1.12.0 链接: ubuntu20.04下安装pcl. 或者 链接: PCL1.12VTK7.1.1 && Ubuntu20.04.3VSCode(官…

Python一炮句搞定网页登录验证码自动输入

前言&#xff1a;本来是“账号密码”的登录方式&#xff0c;突然就增加了验证码输入&#xff0c;还30秒一变。 查看元素 链接为一个png图片文件&#xff0c;每半分钟一更新&#xff0c;意思就是慢了还不行。 思路&#xff1a;&#xff2f;&#xff23;&#xff32;识别图片中的…

【并发】Java并发线程池底层原理详解与源码分析(下)

【并发】Java并发线程池底层原理详解与源码分析&#xff08;下&#xff09; 前情回顾 上篇文章地址 【并发】Java并发线程池底层原理详解与源码分析&#xff08;上&#xff09;_面向鸿蒙编程的博客-CSDN博客线程池不允许使用 Executors 去创建&#xff0c;而是通过 ThreadPo…

浅析数据迁移工具Sqoop

title: Sqoop系列 第一章 Sqoop理论 1.1 概述 sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。 导入&#xff08;Import&#xff09;数据&#xff1a;MySQL&#xff0c;Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统 导出&…

八、Gateway

文章目录一、Gateway网关1.网关的作用二、配置网关1.创建gateway模块2.引入依赖3.编写application.yml4.启动gateway模块&#xff0c;查看是否能访问user-service服务三、路由断言工厂Route Predicate Factory四、GatewayFilter&#xff08;过滤器&#xff09;1.添加过滤器方式…

IDEA2022用maven创建的Servlet项目

因为博主太菜太笨&#xff0c;总是记不住大佬教的步骤&#xff0c;写一篇博客记录一下。 有什么不对&#xff0c;或者疑惑可以请假这位大佬&#xff08;没错就是那个被我问烦的大佬&#xff09;ljj大佬 第一步&#xff1a;新建maven 新建Project 选择webapp 初始界面需要等待…

S32K144之ADC

一&#xff0c;S32K144的ADC介绍 1&#xff0c;ADC模块特性 S32K14x和S32K14xW包含两个12位ADC模块&#xff0c;ADC0和ADC1。 S32K11x包含一个12位的ADC模块&#xff0c;ADC0。 不同封装&#xff0c;ADC0和ADC1所包含的通道数不一样&#xff0c;LQFP100来说ADC0和ADC1分别有16…