【IPC通信--消息队列】

消息队列(也叫做报文队列)是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。
IPC消息队列资源的限制
IPC消息队列的缺省数为16
每个消息的缺省最大值8192字节
队列中全部信息的缺省大小为16384字节

消息队列的概念和原理

消息队列是一种进程间通信(IPC)的机制,它允许不同进程之间通过消息进行交互。消息队列由内核负责管理,可以按顺序发送消息包(消息类型和消息内容),也可以全双工工作,即同时接收和发送消息。消息队列可以不按消息的顺序接收消息,因此具有一定的灵活性。

消息队列的应用场景

1.进程间通信:消息队列可以用于实现不同进程之间的通信,例如,一个进程需要向另一个进程发送数据或者通知,可以使用消息队列来实现。

2.异步处理:当一个进程需要异步处理某些任务时,可以使用消息队列来实现。例如,一个进程需要等待某个事件发生,它可以通过消息队列发送一个消息,通知另一个进程该事件已经发生。

3.任务分发:在分布式系统中,消息队列可以用于任务分发。例如,一个进程需要将某个任务分发给其他进程,它可以通过消息队列发送任务信息,其他进程收到消息后,可以按照任务要求进行处理。

4.日志记录:消息队列可以用于记录系统日志,当一个进程需要记录日志时,它可以将日志信息发送到消息队列,另一个进程可以实时接收并保存这些日志信息。

消息队列的优缺点

1.优点: 

   - 消息队列允许不同进程之间进行异步通信,提高了系统的并发性能。 

   - 消息队列具有一定的可靠性,即使接收进程没有及时处理消息,消息队列仍然可以保存消息。 

   - 消息队列可以实现进程间的解耦,降低了进程之间的依赖关系。

2.缺点: 

   - 消息队列的通信效率较低,因为消息需要经过内核的复制和传输。 

   - 消息队列的实现较为复杂,需要涉及到进程间通信、内存管理等方面的知识。

消息队列模型

操作消息队列

1打开或创建消息队列.
2读写操作:消息读写操作非常简单,对开发人员来说,每个消息都类似如下的数据结构:

struct msgbuf{
    long mtype;
    char mtext[1];
};
mtype 成员代表消息类型,从消息队列中读取消息的一个重要依据就是消息的类型; mtext 是消息内容,当然长度不一定为 1 。对于 发送消息来说,首先预置一个 msgbuf 缓冲区并写入消息类型和内容,调用相应的发送函数即可;对读取消息来说,首先分配这样一个 msgbuf 缓冲区,然后把消息读入该缓冲区即

3获得或设置消息队列属性

消息队列 API 共有四个,使用时需要包括几个头文件:
#include <sys/ types.h >
#include <sys/ ipc.h >
#include <sys/ msg.h >

消息队列的基本操作msgget()

功能
创建 一个新消息队列或 打开 一个存在的队列
函数原型
int msgget ( key_t key , int flag );
参数说明
key :待创建 / 打开队列的键值,如果 key 值为 IPC_PRIVATE 则创建一个新的消息队列。
flag :创建 / 打开方式
IPC_CREAT :如果存在与当前 key 值相同的消息队列,则返回该消息队列 id 。如果不存在,则创建一个新的消息队列。
IPC_EXCL :如果存在与当前 key 值相同的消息队列,则返回失败。
返回值
成功返回消息队列 描述符 ,否则返回 -1

ftok函数

ftok 原型:

      key_t   ftok( char * fname,       int id )

参数:

     fname指定的文件名(该文件必须是存在而且可以访问的)id是子序号,虽然为int,但是只有8个比特被使用(0-255)

返回值:

当成功执行的时候,一个key_t值将会被返回,否则 -1 被返回。

在一般的 UNIX 实现中,是将文件的索引节点号取出,前面加上子序号得到 key_t 的返回值。如指定文件的索引节点号为 65538 ,换算成 16 进制为 0x010002 ,而你指定的 ID 值为 38 ,换算成 16 进制为 0x26 ,则最后的 key_t 返回值为 0x26010002

消息队列的基本操作msgrcv()

函数 原型
ssize_t msgrcv (int msqid , struct msgbuf * msgp , size_t size , long type , int flag );
功能
该系统调用从 msqid 代表的消息队列中读取一个消息,并把消息存储在 msgp 指向的 msgbuf 结构中。
参数说明

msqid:消息队列描述字,描述从哪个消息队列读取消息

msgp:消息存储位置

size消息内容的长度(mtext[])

type:请求读取的消息类型

根据 type 的不同分成三种情况处理
type=0 :接收该队列的第一个消息,并将它返回给调用者
type>0 :接收类型 type 的第一个消息
type<0 :接收小于等于 type 绝对值的最低类型的第一个消息

消息队列的基本操作msgrcv()工作流程

flag:规定队列无消息时内核应做的操作

IPC_NOWAIT :如果现在没有消息,调用进程立即返回,同时返回 -1
IPC_EXCEPT type>0 时使用,返回第一个类型不为 type 的消息
IPC_NOERROR :如果队列中满足条件的消息内容大于所请求的 size 字节,则把该消息截断,截断部分将丢失。如果没有设置 IPC_NOERROR ,而消息又太长,则出错返回 E2BIG ,此时消息仍留在队列中。
调用返回:

成功返回读出消息的实际字节数,否则返回-1

注意:

取消息的时候并不一定按照先进先出的次序取消息,可以按照消息的类型字段取消息。

消息队列的基本操作msgsnd()

函数原型
int msgsnd (int msqid , struct msgbuf * msgp , size_t msgsize , int flag );
功能
msqid 代表的消息队列发送一个消息,即将发送的消息存储在 msgp 指向的 msgbuf 结构中,消息的大小由 msgze 指定。
参数说明
对发送消息来说,有意义 flag 标志为 IPC_NOWAIT ,指明在消息队列没有足够空间容纳要发送的消息时, msgsnd 是否等待。
造成 msgsnd () 等待的条件:
当前消息的大小与当前消息队列中的字节数之和 超过 了消息队列的 总容量
msgsnd () 解除阻塞的条件有三个:
消息 队列中有容纳该消息的空间;
msqid 代表的消息队列被删除;
调用 msgsnd ()的进程被信号中断
调用返回:成功返回 0 ,否则返回 -1

消息队列的基本操作msgctl()

函数原型
int msgctl (int msqid , int cmd , struct msqid_ds * buf );
功能
该系统调用对由 msqid 标识的消息队列执行 cmd 操作,共有三种 cmd 操作: IPC_STAT IPC_SET IPC_RMID
IPC_STAT :该命令用来获取消息队列信息,返回的信息存贮在 buf 指向 内存
IPC_SET :该命令用来设置消息队列的属性,要设置的属性存储在 buf 指向的 msqid_ds 结构 中;可设置属性包括: msg_perm.uid msg_perm.gid msg_perm.mode 以及 msg_qbytes
IPC_RMID :删除 msqid 标识的消息队列;

        调用返回:成功返回0,否则返回-1

消息队列使用示例——发送

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msg{
        long msg_types;
        char msg_buf[512];
};
int main()
{
        int qid;
        int pid;
        int len;
        struct msg pmsg;
        pmsg.msg_types = getpid();
        sprintf(pmsg.msg_buf, "hello!this is:%d\n",getpid());
        len = strlen(pmsg.msg_buf);
        //key_t key;
        //key = ftok(“usr/local/test”, 30);
        if((qid = msgget(0x66, IPC_CREAT | 0666))<0)
        {
                perror("msgget");
                exit(1);
        }
        if((msgsnd(qid, &pmsg, len, 0))<0)
        {
                perror("msgsnd");
                exit(1);
        }
        printf("successfully send a message to the queue:%d\n", qid);
	    system("ipcs  -q");
        return 0;
}

 消息队列使用示例——接收

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define BUFSIZE 4096
struct msg{
        long msg_types;
        char msg_buf[511];
};
int main(int argc, char* argv[])
{
        int qid, len;
        struct msg pmsg;
        qid = msgget(0x66,IPC_CREAT | 0666);
        //key_t key;
        //key = ftok(“usr/local/test”, 30);
        len = msgrcv(qid, &pmsg, BUFSIZE, 0, 0);
	    if(len > 0){
                pmsg.msg_buf[len] = '\0';
                printf("recving que id:%ld\n",qid);
                printf("message type:%d\n", pmsg.msg_types);
                printf("message length:%d\n",len);
                printf("message text:%s\n",pmsg.msg_buf);
        }else if(len == 0)
                printf("no message!");
        else{
                perror("msgrcv");
		      exit(0);
        }
        system("ipcs -q");
        exit(0);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Type-C双盲插显示器,无需外挂MOS最简版本

在2021年5月&#xff0c;USB-IF协会破茧而出&#xff0c;发布了全新的USB PD3.1规范&#xff0c;如同凤凰涅槃&#xff0c;将快充功率上限从100 W扶摇直上至240 W。这一壮举不仅让USB PD的影响力渗透到手机、笔记本电脑的领域&#xff0c;更是将其触角延伸至了更为广阔的天地&a…

SpikingJelly笔记之泊松编码

文章目录 前言一、泊松编码的原理二、生成符合泊松分布的脉冲序列三、SpikingJelly中的泊松编码四、Lena图像的泊松编码与还原1.原始图像2.图像编码3.图像还原 总结 前言 记录SpikingJelly中泊松编码的使用方法&#xff0c;对图像数据进行编码与还原 一、泊松编码的原理 基于…

在版权付费方面,OpenAI 比人想象中的还要「小气」

随着新闻出版商与AI公司达成“使用新闻训练AI模型”的协议&#xff0c;像 OpenAI 等科技企业愿意为受版权保护的信息支付的价格逐渐浮出水面。 据 The Information 报道&#xff0c;OpenAI 每年愿意向出版商提供 100万到500万美元来支付受版权保护的新闻文章训练其AI模型。 但…

微软最新研究成果:使用GPT-4合成数据来训练AI模型,实现SOTA!

文本嵌入是各项NLP任务的基础&#xff0c;用于将自然语言转换为向量表示。现有的大部分方法通常采用复杂的多阶段训练流程&#xff0c;先在大规模数据上训练&#xff0c;再在小规模标注数据上微调。此过程依赖于手动收集数据制作正负样本对&#xff0c;缺乏任务的多样性和语言多…

成功面试软件工程师的关键素质

目录 前言1 过硬的技术1. 1 不断学习的重要性1.2. 编码实践的重要性1.3 技术分享促进个人成长 2 良好的沟通能力2.1 建立信任与共鸣2.2 沟通技巧的重要性2.3 构建积极的沟通氛围 3 具有良好的性格结语 前言 在当今科技飞速发展的时代&#xff0c;软件工程师作为技术领域的中流…

汪林望教授将于每周三以互动问答直播形式教您如何用龙讯旷腾计算软件PWmat计算不同材料性质

打开VX→搜索“汪林望计算讲座”&#xff0c;关注汪老师的频道&#xff0c;每周三下午16:00我们准时直播&#xff01; 大家提前准备好问题&#xff0c;可直接提问讨论&#xff0c;当面请教 汪林望教授 中科院半导体所首席科学家 北京龙讯旷腾科技有限公司创始人 美国劳伦斯…

第九届中西部外语翻译大赛初赛阶段已经圆满结束

2023年第九届中西部外语翻译大赛&#xff08;以下简称竞赛&#xff09;&#xff0c;于2023年12月30日至31日举行。历届中西部外语翻译大赛均由中西部翻译协会共同体指导发起&#xff0c;各省市译协共建学术指导委员会&#xff0c;获奖证书盖章单位由四川省翻译协会、广西翻译协…

Nginx 文件名逻辑漏洞(CVE-2013-4547)

目录 Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09; 1.cd到CVE-2013-4547 2.执行docker-compose up -d 3.查看靶场是否开启成功 4.访问浏览器 5.上传含有一句话木马的图片 6.burp抓包 7.在shell.gif加空格 8.放包 9.访问路径 10.继续抓包 11.在aa后面…

【漏洞复现】锐捷RG-UAC统一上网行为管理系统信息泄露漏洞

Nx01 产品简介 锐捷网络成立于2000年1月&#xff0c;原名实达网络&#xff0c;2003年更名&#xff0c;自成立以来&#xff0c;一直扎根行业&#xff0c;深入场景进行解决方案设计和创新&#xff0c;并利用云计算、SDN、移动互联、大数据、物联网、AI等新技术为各行业用户提供场…

[C#]Onnxruntime部署Chinese CLIP实现以文搜图以文找图功能

【官方框架地址】 https://github.com/OFA-Sys/Chinese-CLIP 【算法介绍】 在当今的大数据时代&#xff0c;文本信息处理已经成为了计算机科学领域的核心议题之一。为了高效地处理海量的文本数据&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术应运而生。而在诸多N…

在做题中学习(43):长度最小的子数组

LCR 008. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;同向双指针-------滑动窗口算法 解释&#xff1a;本是暴力枚举做法&#xff0c;因为全部是正整数&#xff0c;就可以利用单调性和双指针解决问题来节省时间 思路&#xff1a; 如上面图&am…

【Linux】之搭建 PostgreSQL 环境

前言 在 Linux 系统下安装 PostgreSQL&#xff0c;可以选择快捷方便的 Docker 安装&#xff0c;但正常的服务器都是直接原生安装的&#xff0c;所以&#xff0c;这里我将讲解如何正常安装 PostgreSQL 以及安装之后的一些配置。如果想了解 Docker 安装的话&#xff0c;可以查看我…

06、Kafka ------ 各个功能的作用解释(ISR 同步副本、非同步副本、自动创建主题、修改主题、删除主题)

目录 CMAK 各个功能的作用解释★ ISR副本 (同步副本&#xff09;★ 非同步副本★ 自动创建主题★ 修改主题★ 删除主题 CMAK 各个功能的作用解释 ★ ISR副本 (同步副本&#xff09; 简单来说 &#xff0c;ISR 副本 就是 Kafka 认为与 领导者副本 同步的副本。 ISR&#xff0…

2024--Django平台开发-基础信息(一)

一、前置知识点 - Python环境搭建 (Python解释器、Pycharm、环境变量等) - 基础语法(条件、循环、输入输出、编码等) - 数据类型(整型、布尔型、字符串、列表、字典、元组、集合等) - 函数(文件操作、返回值、参数、作用域等) - 面向对象 (类、对象、封装、继承、多态等)包和模…

SOLIDWORKS PDM—序列号的使用

SOLIDWORKS产品数据管理 (PDM) 解决方案可帮助您控制设计数据&#xff0c;并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional&#xff0c;您的团队能够&#xff1a;1. 安全地存储和索引设计数据以实现快速检索&#xff1b;2. 打消关于…

综合智慧能源监测管理平台,实现能源管理“透明”化

能源问题是全球面临的最大问题&#xff0c;在提高经济增长的同时&#xff0c;也引发了能源供应危机及环境严重等问题&#xff0c;降低能源管理、低碳环保是我们未来发展的必经之路。 为了解决这一问题&#xff0c;智慧能源管理平台应运而生。平台采用微服务架构&#xff0c;整…

ant-design-vue的日期组件a-range-picker赋值的问题

在使用ant-design-vue的日期组件时&#xff0c;总是会碰到赋值问题&#xff0c;习惯性的赋值就是直接给日期组件的变量赋值字符串类型&#xff0c;如下 // html部分 <a-range-picker v-model"dateValue" :format"YYYY-MM-DD"/> // js部分 data() {r…

HNU-数据库系统-作业

数据库系统-作业 计科210X 甘晴void 202108010XXX 第一章作业 10.09 1.(名词解释)试述数据、数据库、数据库管理系统、数据库系统的概念。 数据&#xff0c;是描述事物的符号记录。 数据库&#xff08;DB&#xff09;&#xff0c;是长期存储在计算机内、有组织、可共享的大量…

基于springboot+html的宠物医院管理系统设计与实现

基于springboothtml的宠物医院管理系统设计与实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 前言 随着人们对宠物健康的关注度不断提高&#xff0c;宠物医院的…

网络安全B模块(笔记详解)- 网络爬虫渗透测试

LAND网络渗透测试 1.进入虚拟机操作系统:BT5中的/root目录,完善该目录下的land.py文件,填写该文件当中空缺的Flag1字符串,将该字符串作为Flag值(形式:Flag1字符串)提交;(land.py脚本功能见该任务第6题) 输入flag sendp(packet) Flag:sendp(packet) 2.进入虚拟机操作…