【IPC通信--消息队列】

news2024/9/22 17:24:59

消息队列(也叫做报文队列)是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。
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);
}

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

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

相关文章

优秀案例 | 嘉吉动物营养虚拟人IP“小嘉”, 虚拟动力提供常态化高效率短视频制作工具

在流量见顶的时代 品牌宣传逐渐精细化 塑造一个具备亲和力及创新感的虚拟IP 可以持续扩大品牌影响力 与挖掘品牌更多可能性 「嘉吉动物营养」紧随营销趋势&#xff0c;通过广州虚拟动力「虚拟人运营套装」&#xff0c;将虚拟人IP运营与品牌宣传相结合&#xff0c;带动品牌形…

从音乐“卷”到直播,涨价也救不了腾讯音乐

继6月大规模涨价之后&#xff0c;腾讯音乐娱乐集团&#xff08;下称“腾讯音乐”&#xff0c;01698.HK&#xff09;旗下QQ音乐会员再次涨价。 「不二研究」据腾讯音乐三季报发现&#xff1a;在会员数这一关键指标上&#xff0c;腾讯音乐在三季度的月活跃用户从去年同期的6.20亿…

STM32深入系列02——BootLoader分析与实现

文章目录 1. STM32程序升级方法1.1 ST-Link / J-link下载1.2 ISP&#xff08;In System Programing&#xff09;1.3 IAP&#xff08;In Applicating Programing&#xff09;1.3.1 正常程序运行流程1.3.2 有IAP时程序运行流程 2. STM32 Bootloader实现2.1 方式一&#xff1a;Boo…

开启Android学习之旅-2-架构组件实现数据列表及添加(kotlin)

Android Jetpack 体验-官方codelab 1. 实现功能 使用 Jetpack 架构组件 Room、ViewModel 和 LiveData 设计应用&#xff1b;从sqlite获取、保存、删除数据&#xff1b;sqlite数据预填充功能&#xff1b;使用 RecyclerView 展示数据列表&#xff1b; 2. 使用架构组件 架构组…

HarmonyOS4.0系统性深入开发16进程模型概述

进程模型概述 HarmonyOS的进程模型&#xff1a; 应用中&#xff08;同一包名&#xff09;的所有UIAbility运行在同一个独立进程中。WebView拥有独立的渲染进程。 基于HarmonyOS的进程模型&#xff0c;系统提供了公共事件机制用于一对多的通信场景&#xff0c;公共事件发布者…

「网络安全术语解读」SARIF详解

引言&#xff1a;什么是SARIF&#xff1f;它的产生背景是什么&#xff1f;SARIF主要包含哪些内容&#xff1f;使用SARIF有哪些好处&#xff1f; 1. SARIF简介 SARIF&#xff08;Static Analysis Results Interchange Format &#xff0c;静态分析结果交换格式&#xff09;是一…

PTA——猴子吃桃问题

一只猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个&#xff1b;第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时&#xff0c;见只剩下一个桃子了…

BOM介绍

文章目录 1、简介主要作用 2、BOM的组成2.1 窗口对象window2.1.1 window对象特点2.1.2 window作用域2.1.3 window对象常见方法**第一类&#xff1a;系统对话框**第二类&#xff1a;控制浏览器窗口方法第三类&#xff1a;与定时器有关的方法 1、简介 BOM&#xff08;Browser Ob…

docker安裝gocd-server,并配置gitlab授权登录

gocd的地址&#xff1a;Installing GoCD server on Windows | GoCD User Documentation gocd文档&#xff1a;GitHub - gocd/docker-gocd-server: Docker server image for GoCD 一、docker拉取gocd镜像 #拉取server镜像 docker pull gocd/gocd-server:v21.1.0docker pull g…

3的幂00

题目链接 3的幂 题目描述 注意点 无 解答思路 不断除以3直到除数或余数为0为止&#xff0c;判断除完后的数字是否为1 代码 class Solution {public boolean isPowerOfThree(int n) {while (n / 3 ! 0) {if (n % 3 ! 0) {return false;}n n / 3;}return n 1;} }关键点 …

springmvc内嵌tomcat、tomcat整合springmvc、自研国产web中间件

springmvc内嵌tomcat、tomcat整合springmvc、自研国产web中间件 这是由于公司老项目转化springboot存在太多坑&#xff0c;特别是hibernate事务一条就坑到跑路&#xff0c;你又不想搞没听说过的国产中间件兼容&#xff0c;又不想搞weblogic、WebSphere等中间件的适配&#xff…

【蓝桥杯软件赛 零基础备赛20周】第7周——二叉树

文章目录 1 二叉树概念2 二叉树的存储和编码2.1 二叉树的存储方法2.2 二叉树存储的编码实现2.3 二叉树的极简存储方法 3 例题4 习题 前面介绍的数据结构数组、队列、栈&#xff0c;都是线性的&#xff0c;它们存储数据的方式是把相同类型的数据按顺序一个接一个串在一起。简单的…

MPL3115A2大气压温度采集芯片的工作原理与特点详解

目录 一、引言 二、MPL3115A2主要特点和功能 三、主要优势 3.1 内部自动补偿 3.2 FIFO 四、硬件原理图 4.1 硬件连接 五、软件配置 六、资料获取 一、引言 MPL3115A2是一款高精度的大气压力传感器&#xff0c;能够测量大气压力、海拔高度和温度。它采用了MEMS&#xf…

Redis内存策略:「过期Key删除策略」+ 「内存淘汰策略」

Redis之所以性能强&#xff0c;最主要的原因就是基于内存存储&#xff0c;然而单节点的Redis其内存大小不宜过大&#xff0c;否则会影响持久化或主从同步的性能。 Redis内存满了&#xff0c;会发生什么&#xff1f; 在Redis的运行内存达到了某个阈值&#xff0c;就会触发内存…

Linux - No space left on device

问题描述 No space left on device 原因分析 说明在服务器设备上的存储空间已经满了&#xff0c;不能再上传或者新建文件夹或者文件等。 解决方案 确认查看服务器系统的磁盘使用情况是否是真的已经没有剩余空间&#xff0c;复制下面命令在服务器上运行&#xff0c;然后发现如果…

CSS 彩虹按钮效果

<template><view class"content"><button class"btn">彩虹按钮</button></view> </template><script></script><style>body{background-color: #000;}.content {margin-top: 300px;}.btn {width: 1…

jenkins忘记密码后的操作

1、先停止 jenkins 服务 systemctl stop jenkins 关闭Jenkins服务 或者杀掉进程 ps -ef | grep jenkins &#xff5c;awk {print $2} | grep -v "grep" | xargs kill -9 2、找到 config.xml 文件 find /root -name config.xml3、备份config.xml文件 cp /root/.jen…

添加一个编辑的小功能(PHP的Laravel)

一个编辑的按钮可以弹出会话框修改断更天数 前台 加一个编辑按钮的样式&#xff0c;他的名字是固定好的 之前有人封装过直接用就好&#xff0c;但是一定放在class里面&#xff0c;不要放在id里面 看见不认识的方法一定要去看里面封装的是什么 之前就是没有看&#xff0c;所以…

包含自动轮播、点击切换、显示图片信息和页码方框显示码数的 HTML 和 JavaScript 示例:

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图</title><style>#carousel-conta…

hfish蜜罐docker部署

centos 安装 docker-CSDN博客Docker下载部署 Docker是我们推荐的部署方式之一&#xff0c;当前的版本拥有以下特性&#xff1a; 自动升级&#xff1a;每小时请求最新镜像进行升级&#xff0c;升级不会丢失数据。数据持久化&#xff1a;在宿主机/usr/share/hfish目录下建立dat…