Linux多进程(二)进程通信方式二 消息队列

消息队列是在两个进程之间传递二进制块数据的一种简单有效的方式。每个数据块都有一个特定的类型,接收方可以根据类型来有选择地接收数据,而不一定像管道和命名管道那样必须以先进先出的方式接收数据。

一、创建消息队列

创建一个消息队列或者获取一个已经存在的消息队列

#include <sys/msg.h>int msgget(key_t key, int msgflg);
  • key参数是一个键值,用来标识一个全局唯一的消息队列。

  • msgflg参数是一组标志,用于指定消息队列的创建方式和权限。常见的标志包括

    • IPC_CREAT:如果消息队列不存在则创建它
    • IPC_EXCL:与 IPC_CREAT 一起使用,确保只在消息队列不存在时创建它
    • 权限标志:例如 IPC_PRIVATE,表示创建一个私有的消息队列
  • 成功时返回一个正整数值,它是消息队列的标识符。msgget失败时返回-1,并设置errno。‘

如果msgget用于创建消息队列,则与之关联的内核数据结构msqid_ds将被创建并初始化。msqid_ds结构体的定义如下:

struct msqid_ds {struct ipc_perm msg_perm;/*消息队列的操作权限*/time_t msg_stime;/*最后一次调用msgsnd的时间*/time_t msg_rtime;/*最后一次调用msgrcv的时间*/time_t msg_ctime;/*最后一次被修改的时间*/unsigned long __msg_cbytes;/*消息队列中已有的字节数*/msgqnum_t msg_qnum;/*消息队列中已有的消息数*/msglen_t msg_qbytes;/*消息队列允许的最大字节数*/pid_t msg_lspid;/*最后执行msgsnd的进程的PID*/pid_t msg_lrpid;/*最后执行msgrcv的进程的PID*/
};

二、添加消息

把一条消息添加到消息队列中

#include <sys/msg.h>int msgsnd(int msqid, const void* msg_ptr, size_t msg_sz, int msgflg);
  • msqid参数是由msgget调用返回的消息队列标识符。

  • msg_ptr参数指向一个准备发送的消息,消息必须被定义为如下类型:

struct msgbuf {long mtype;/*消息类型*/char mtext[512];/*消息数据*/
};
    • mtype指定消息类型,必须是一个正整数。
      • mtext是数据
  • msg_sz 是数据的长度,这个长度可以为0,表示没有数据
  • msgflg参数控制msgsnd的行为。它通常仅支持IPC_NOWAIT标志,即以非阻塞的方式发送消息。并设置errno为EAGAIN。

处于阻塞状态的msgsnd调用可能被如下两种异常情况所中断:

  • 消息队列被移除。此时msgsnd调用将立即返回并设置errno为EIDRM。
  • 程序接收到信号。此时msgsnd调用将立即返回并设置errno为EINTR。

三、读取消息

从消息队列中获取消息

#include <sys/msg.h>int msgrcv(int msqid, void* msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
  • msqid参数是由msgget调用返回的消息队列标识符。

  • msg_ptr参数用于存储接收的消息,msg_sz参数指的是消息数据部分的长度。

  • msgtype参数指定接收何种类型的消息。我们可以使用如下几种方式来指定消息类型:

    • msgtype等于0。读取消息队列中的第一个消息。
    • msgtype大于0。读取消息队列中第一个类型为msgtype的消息。(除非指定了标志MSG_EXCEPT)
    • msgtype小于0。读取消息队列中第一个类型值比msgtype的绝对值小的消息。
  • msgflg控制msgrcv函数的行为。它可以是如下一些标志的按位或:

    • IPC_NOWAIT。如果消息队列中没有消息,则msgrcv调用立即返回并设置errno为ENOMSG。
    • MSG_EXCEPT。如果msgtype大于0,则接收消息队列中第一个非msgtype类型的消息。
    • MSG_NOERROR。如果消息数据部分的长度超过了msg_sz,就将它截断。

处于阻塞状态的msgrcv调用还可能被如下两种异常情况所中断:

  • 消息队列被移除。此时msgrcv调用将立即返回并设置errno为EIDRM。
  • 程序接收到信号。此时msgrcv调用将立即返回并设置errno为EINTR。

msgrcv成功时返回0,失败则返回-1并设置errno。

四、设置消息队列属性

控制消息队列的某些属性

#include <sys/msg.h>int msgctl(int msqid, int command, struct msqid_ds* buf);
  • msqid参数是由msgget调用返回的共享内存标识符

  • command参数指定要执行的命令

    • IPC_STAT:将消息队列关联的内核数据结构复制到buf,成功返回0。
    • IPC_SET:将buf中的部分成员复制到关联的内核数据结构,同时 msg_ctime 被更新,成功返回0。
    • IPC_RMID:立即移除消息队列,唤醒所有等待读消息和写消息的进程,成功返回0。
    • IPC_INFO:获取系统消息资源配置信息,结果存放在buf,读取的话需要将buf转换为msginfo结构,成功返回内核消息队列个数。
    • MSG_INFO:与IPC_INFO类似,不过返回的时已经分配的消息队列占用的资源信息。
    • MSG_STAT:与IPC_STAT类似,不过此时msqid参数表示内核消息队列信息数组的索引。返回索引值为msqid的消息队列标识符。

五、仿真

发送消息的进程

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>#define MAX_MSG_SIZE 100struct msg_buffer {long msg_type;char msg_text[MAX_MSG_SIZE];
};int main() {// 生成一个唯一的键值key_t key = ftok("/tmp", 'A');// 创建一个消息队列int msgid = msgget(key, IPC_CREAT | 0666);if (msgid == -1) {perror("msgget");exit(EXIT_FAILURE);}// 生成消息struct msg_buffer message;message.msg_type = 1;strcpy(message.msg_text,"hello, this is thread A\n");// 发送消息到队列if (msgsnd(msgid, &message, sizeof(message), 0) == -1) {perror("msgsnd");exit(EXIT_FAILURE);}// 休眠sleep(100);// 删除消息队列if (msgctl(msgid, IPC_RMID, NULL) == -1) {perror("msgctl");exit(EXIT_FAILURE);}while(1);return 0;
}

接收消息的进程

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>#define MAX_MSG_SIZE 100struct msg_buffer {long msg_type;char msg_text[MAX_MSG_SIZE];
};int main() {// 生成一个唯一的键值key_t key = ftok("/tmp", 'A');// 获取已存在的消息队列int msgid = msgget(key, 0666);if (msgid == -1) {perror("msgget");exit(EXIT_FAILURE);}// 从消息队列中接收消息struct msg_buffer message;if (msgrcv(msgid, &message, sizeof(message), 1, 0) == -1) {perror("msgrcv");exit(EXIT_FAILURE);}printf("Received message: %s", message.msg_text);return 0;
}

仿真

ima4ahjksdhajkshd

查看当前系统上拥有哪些共享资源实例

ipcs

imhdjk3

可以看到我们有一个消息队列。

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

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

相关文章

Linux多进程(二)进程通信方式一 管道

管道的是进程间通信&#xff08;IPC - InterProcess Communication&#xff09;的一种方式&#xff0c;管道的本质其实就是内核中的一块内存(或者叫内核缓冲区)&#xff0c;这块缓冲区中的数据存储在一个环形队列中&#xff0c;因为管道在内核里边&#xff0c;因此我们不能直接…

Go语言并发赋值的安全性

struct并发赋值 type Test struct {X intY int }func main() {var g Testfor i : 0; i < 1000000; i {var wg sync.WaitGroup// 协程 1wg.Add(1)go func() {defer wg.Done()g Test{1, 2}}()// 协程 2wg.Add(1)go func() {defer wg.Done()g Test{3, 4}}()wg.Wait()// 赋值…

全氟己酮灭火绳的用法早知道:灭火绳多少钱一米?

全氟己酮灭火装置作为一种高效、安全、环保的灭火技术&#xff0c;已经成为了备受青睐的新型灭火选择之一。伴随着市场需求不断增长&#xff0c;在全氟己酮厂家的努力下&#xff0c;各式各样的全氟己酮自动灭火装置不断涌现&#xff0c;包括自动灭火贴、灭火片、灭火毯、灭火绳…

直播报名 | 科技出海新势力,遥感+AI助力一带一路

遥感技术的出海之路顺畅吗&#xff1f; 国内外遥感应用的关注点相同吗&#xff1f; 目前珈和主要辐射哪些海外国家&#xff1f; … 上周数据赋农季第三期《科技出海&#xff0c;遥感AI赋能“一带一路”提升种植园规模效益》直播预告一出&#xff0c;小伙伴们纷纷来咨询珈和的海…

《S32G3系列芯片——Boot详解》持续更新中...

总目录&#xff1a;《S32G3系列芯片——Boot详解》持续更新中... ... 一、前言二、启动时序概述&#xff08;Boot Sequence&#xff09;三、启动特性&#xff08;Boot Features&#xff09;四、启动模式&#xff08;Boot Mode&#xff09;五、《S32G3系列芯片——Boot详解》系列…

Centos之yum安装好玩的命令

1.会动的小火车 我在root下使用的 yum install sl.x86_64sl2.figlet yum install figlet.x86_64figlet 55553.cowsay会说话 yum install cowsay

力扣数据库题库学习(4.23日)

610. 判断三角形 问题链接 解题思路 题目要求&#xff1a;对每三个线段报告它们是否可以形成一个三角形。以 任意顺序 返回结果表。 对于三个线段能否组成三角形的判定&#xff1a;任意两边之和大于第三边&#xff0c;对于这个表内的记录&#xff0c;要求就是&#xff08;x…

一看就会,uni-app打包运行成微信小程序,部署

前言 这篇文章主要针对刚开始接触混合开发的小伙伴&#xff0c;全文使用uniapp框架&#xff0c;使用HBuilderX结合微信小程序开发工具作为开发环境。搭建一个简单的入手项目&#xff0c;主要是对搭建项目的流程做一个简单介绍 提示&#xff1a;以下是本篇文章正文内容&#xff…

【GEE】优雅地实现年度、季度、月度甚至旬度影像合成(附完整代码)

以下文章来源于GEE学习室 &#xff0c;作者GEEStudyRoom 光学影像由于受到天气因素&#xff08;云、雨和雾等&#xff09;影响&#xff0c;导致单张影像数据存在大量坏死像元。此处&#xff0c;坏死像元指由于受到云遮挡等导致下垫面地物覆盖不能准确被卫星信息捕捉从而不能正…

【Linux系统编程】第八弹---权限管理操作(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、修改文件权限的做法(二) 2、文件类型 3、可执行权限 4、创建文件/目录的默认权限 4.1、权限掩码 总结 前面一弹我们学…

git 重命名文件,提交后,此文件的提交记录丢失

零、问题现象&#xff1a; 文件重命名后&#xff0c;提交到 git 仓库&#xff0c;发现重命名操作 变成 删除旧文件&#xff0c;新增一个新文件&#xff0c;原来文件的提交记录丢失&#xff0c;看不到了。 一、正确的重命名提交方法 1.1、 先执行add命令来将修改内容后的文件…

校园论坛圈子,校园跑腿小程序,2024 一款功能强大校园综合服务小程序开源源码

目的 本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统&#xff0c;前台用户使用小程序发布跑腿任何和接跑腿任务&#xff0c;系统基于TP6uni-app框架开发;客户移动端采用uni-app开发&#xff0c;管理后台TH6开发&#xff1b;通过后台管理跑腿的用户、查看跑腿信…

2024年最佳软件测试工具40强清单

什么是测试工具 软件测试工具是指那些支持从计划、需求收集、构建创建、测试执行、缺陷记录到测试分析等各种测试活动的产品。这些工具主要用于检测软件的稳定性、彻底性以及其他性能参数。 市场上有大量的软件测试工具&#xff0c;众多选择使得难以确定最适合你项目的测试工具…

前端css中table表格的属性使用

前端css中table表格的属性使用 一、前言二、常见的表格属性1.边框的样式2.布局和对齐3.间距和填充4.背景和颜色5.字体的样式6.边框的圆角 三、简单的表格&#xff0c;例子11.源码12.源码1效果截图 四、给表格添加动画效果&#xff0c;例子21.源码22.源码2的运行效果 五、结语六…

备考2024年小学生古诗文大会:吃透10道历年真题和知识点(持续)

对上海小学生的小升初和各种评优争章来说&#xff0c;语文、数学、英语的含金量较高的证书还是很有价值和帮助的。对于语文类的竞赛&#xff0c;小学生古诗文大会和汉字小达人通常是必不可少的&#xff0c;因为这两个针对性强&#xff0c;而且具有很强的上海本地特色。 根据往…

基于智能推荐的校园兼职招聘平台

3协同过滤算法简介 目前&#xff0c;推荐算法有很多种&#xff0c;可以应用于日常生活的许多领域&#xff0c;对大量数据进行处理和分析&#xff0c;然后进行分类。它将显示用户可能感兴趣的内容&#xff0c;这是推荐算法的主要功能之一[1]。 协同过滤算法通常包括两类&#…

ARP 攻击神器:ARP Spoof 保姆级教程

一、介绍 arpspoof是一种网络工具&#xff0c;用于进行ARP欺骗攻击。它允许攻击者伪造网络设备的MAC地址&#xff0c;以欺骗其他设备&#xff0c;并截获其通信。arpspoof工具通常用于网络渗透测试和安全评估&#xff0c;以测试网络的安全性和漏洞。 以下是arpspoof工具的一些…

数智亚运,为什么需要智能电子桌牌?

近日&#xff0c;杭州亚运会博物馆正式对公众开放&#xff0c;深度还原了杭州从申请办、筹办至举办亚运会的各个精彩历程。馆内有“亚运与杭州”、“亚运与亚洲”“亚运与未来”三大板块展示区&#xff0c;展示了大量亚运会使用过的实物&#xff0c;还有当时引人注目的数字科技…

遥测终端赋能水库泄洪监测预警,筑牢度汛安全防线!

4月10日&#xff0c;水利部召开水库安全度汛视频会议。会议要求着力强化水库防洪“四预”措施&#xff0c;加快构建雨水情监测预报“三道防线”&#xff0c;完善预警信息发布机制&#xff0c;推进数字孪生水利工程建设&#xff0c;为科学调度指挥决策提供支持。强调坚决牢牢守住…

大模型应用RAG系列(1)初识RAG

题外话 之前我们在讲大模型的应用方向和架构时&#xff0c;有提到RAG、Agent、Fine-Tune。在作者写大模型专题的文章时&#xff0c;也是边学习&#xff0c;边梳理&#xff0c;边总结。在这个过程中&#xff0c;大模型在各个方向都不断地快速发展&#xff0c;对应的paper、理论…