Linux进程间通信4——消息队列

news2024/9/23 23:33:07

目录

1.原理

2.消息队列的系统调用

2.1 msgget

2.2 msgsnd

2.3 msgrcv

2.4 msgctl

3.消息队列的使用——代码演示

4.结论


1.原理

2.消息队列的系统调用

2.1 msgget

用于创建或者获取一个消息队列。成功返回消息队列ID,失败返回-1。

int msgget(key_t key,int msqflg);

msqflg:IPC_CREAT

 

2.2 msgsnd

用于发送一条消息。成功返回0,失败返回-1。

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

msqid:消息队列的id,因为系统中可能有多个消息队列,这id指明往哪个消息队列中添加数据;

msqp:往消息队列中添加的结构体,消息结构为:

struct msgbuf
{
    long mtype;//消息类型,必须大于0(或者说>=1,0代表顺位接收),长整型,比如图中的1,2
    char mtext[1];//消息数据,用户自己定义,可以是任何类型;这里存放消息数据
};

msqsz:指定mtext中有效数据的长度。注意:仅仅指接收的数据的大小,不包含消息类型的大小;

msqflg:标志位,一般设置为0,可以设置IPC_NOWAIT,比如消息队列满了,是阻塞还是失败返回呢?给0代表消息满了自动阻塞,设置IPC_NOWAIT意思是当整个消息队列满的时候会立即返回(no wait),返回一个失败而已。

2.3 msgrcv

用来接收一条消息,成功返回mtext中接收到的数据长度,失败返回-1。

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

msgp:接收消息的结构体,一般约定好,写入什么,接收什么结构体。

msgsz:接收消息的大小,大于等于发送的消息大小,一般和发送的消息大小一样。

msgtyp:指定接收的消息类型(图中的1和2),类型可以为0,为0表示不区分消息类型,按顺位接收消息。

msgflg:一般设置为0,可以设置为IPC_NOWAIT。设置为IPC_NOWAIT,意思是当整个消息队列空的时候会立即返回(no wait),返回一个失败而已;设置为0,意思是当整个消息队列空的时候会阻塞。

2.4 msgctl

用于控制消息队列,也就是对消息队列做一个控制,可以设置消息队列,也可以移除消息队列;成功返回0,失败返回-1。

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

cmd:IPC_RMID

buf:设置或者获取消息队列需要的一个结构体,如果删除就直接给一个NULL。

注:当创建一个消息队列的时候,只要不移除这个消息队列,它就会一直在,除非重启系统。

或者人为删除:ipcrm -q id

3.消息队列的使用——代码演示

进程a发送一条消息,进程b读取消息。

//a.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/msg.h>
#include <string.h>
struct mess
{
    long type;
    char buff[128];
};

int main()
{
    int msgid=msgget((key_t)1234,IPC_CREAT|0600);
    assert(msgid!=-1);

    struct mess dt; 
    dt.type=1;
    strcpy(dt.buff,"hello1");
    msgsnd(msgid,&dt,128,0);
    exit(0);
}
//b.c
include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/msg.h>
#include <string.h>
struct mess
{
    long type;
    char buff[128];
};

int main()
{
    int msgid=msgget((key_t)1234,IPC_CREAT|0600);
    assert(msgid!=-1);

    struct mess dt; 
    msgrcv(msgid,&dt,128,1,0);
    printf("read mess:%s\n",dt.buff);

    exit(0);
}

运行结果:

4.结论

1)没有0号消息,0表示顺位接收,不管什么类型的消息都接收,因为没有0号消息,只有>=1的消息。

2)可以使用ipcrm删除队列,也可以在程序中删除。

方法一:

查看命令:ipcs  -q/-m/-s  

删除命令:ipcrm  -q/-m/-s  id

方法二:

msgctl(msgid,IPC_RMID,NULL);

3)如果设置成IPC_NOWAIT,没有消息不等待

if(msgrcv(msgid,&dt,128,1,IPC_NOWAIT)==-1)
{
    printf("no mess\n");
}
else
{
    printf("read:%s\n",dt.buff);
}

修改后b.c代码:

//b.c
include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/msg.h>
#include <string.h>
struct mess
{
    long type;
    char buff[128];
};

int main()
{
    int msgid=msgget((key_t)1234,IPC_CREAT|0600);
    assert(msgid!=-1);

    struct mess dt; 
    if(msgrcv(msgid,&dt,128,1,IPC_NOWAIT)==-1)
    {
        printf("no mess\n");
    }
    else
    {
        printf("read:%s\n",dt.buff);
    }

    exit(0);
}

修改后运行结果: 

4)消息队列在内存中创建。 

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

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

相关文章

谷歌seo推广效果怎么判断?

要想判断谷歌SEO推广效果&#xff0c;核心在于观察和分析几个关键指标&#xff0c;一个网站最重要的自然就是流量&#xff0c;没有流量的网站说到底就是一个被雪藏的花架子&#xff0c;没什么意义&#xff0c;所以看流量自然就是最重要的指标&#xff0c;SEO做得好&#xff0c;…

【力扣白嫖日记】626.换座位

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 626.换座位 表&#xff1a;Seat 列名类型idintstudentvarchar id 是该表的主键&#xff08;唯一值&#xf…

深入 Starknet 去中心化世界,探秘实用开发利器

Starknet 近期开放空投&#xff0c;面向 130 万地址总量发放超 7 亿枚 Token&#xff0c;让 ECMP 早期贡献者、GitHub 开源开发者、Starknet 用户等各个层面的生态参与者都得以深度参与。 盛宴的背后&#xff0c;是 Starknet 正迎来发展的关键机遇。在今年以太坊坎昆升级的背景…

绕过付费,畅享网络:自由浏览付费内容 | 开源日报 No.185

iamadamdev/bypass-paywalls-chrome Stars: 38.8k License: NOASSERTION bypass-paywalls-chrome 是一个用于 Chrome 和 Firefox 的网页浏览器扩展&#xff0c;可帮助绕过特定网站的付费墙。 可以绕过多个指定网站的付费墙支持自动更新&#xff08;仅限 Firefox 版本&#x…

10.轮廓系数-机器学习模型性能的常用的评估指标

轮廓系数&#xff08;Silhouette Coefficient&#xff09;是评估聚类算法效果的常用指标之一。它结合了聚类的凝聚度&#xff08;Cohesion&#xff09;和分离度&#xff08;Separation&#xff09;&#xff0c;能够量化聚类结果的紧密度和分离度。 背景 1.聚类分析的背景 在…

武汉灰京文化:游戏推广的领军者

在当今飞速发展的游戏行业中&#xff0c;游戏推广成为了每个游戏开发商和发行商必然要面对的挑战。如何能够将游戏信息传播给更广泛的受众群体&#xff0c;提升游戏的知名度和用户参与度&#xff0c;成为了每个游戏从业者需要思考的问题。而武汉灰京文化作为游戏推广领域的领军…

指定新加坡|高职老师自费赴新加坡国立大学访学交流

K老师任职于某高职院校&#xff0c;希望通过自费出国访学&#xff0c;达到拓宽国际化视野&#xff0c;为本校的专业发展寻求新契机的目的&#xff0c;并将访学目标国家指定为新加坡。最终我们为其获得新加坡国立大学的邀请函。因交叉性、前沿性的专业特性&#xff0c;K老师的出…

STM32CubeIDE基础学习-软件安装,环境搭建

STM32CubeIDE基础学习-软件介绍及环境搭建步骤 文章目录 STM32CubeIDE基础学习-软件介绍及环境搭建步骤前言第1章 STM32CubeIDE 介绍1.1 软件描述1.2 软件支持的功能及特点 第2章 STM32CubeIDE 软件安装2.1 STM32CubeIDE 软件获取方法2.2 STM32CubeIDE 软件安装步骤2.2.1 错误安…

一些C语言知识

C语言的内置类型&#xff1a; char short int long float double C99中引入了bool类型&#xff0c;用来表示真假的变量类型&#xff0c;包含true&#xff0c;false。 这个代码的执行结果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…

《精益DevOps》:填补IT服务交付的认知差距,实现高效可靠的客户期望满足

写在前面 在当今的商业环境中&#xff0c;IT服务交付已经成为企业成功的关键因素之一。然而&#xff0c;实现高效、可靠、安全且符合客户期望的IT服务交付却是一项艰巨的任务。这要求服务提供商不仅具备先进的技术能力&#xff0c;还需要拥有出色的组织协作、流程管理和态势感…

(2024,随机交叉注意力,冻结预训练模型的 K 和 V)StochCA:一种利用交叉注意力开发预训练模型的新方法

StochCA: A Novel Approach for Exploiting Pretrained Models with Cross-Attention 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 问题陈述 3.1.1 迁移学习 …

LeetCode206题:反转链表(python3)

采用递归 class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:cur headpre Nonewhile cur:temp cur.next # 保存下一轮循环的节点cur.next pre # 将当前节点 cur 的指针指向上一个节点 prepre curcur tempreturn pre

Network LSA 结构简述

Network LSA主要用于描述一个区域内的网络拓扑结构&#xff0c;包括网络中的路由器和连接到这些路由器的网络。它记录了每个路由器的邻居关系、连接状态以及连接的度量值&#xff08;如带宽、延迟等&#xff09;&#xff0c;以便计算最短路径和构建路由表。display ospf lsdb n…

08. Nginx进阶-Nginx动静分离

简介 什么是动静分离&#xff1f; 通过中间件将动态请求和静态请求进行分离。分离资源&#xff0c;减少不必要的请求消耗&#xff0c;减少请求延时。 动静分离的好处 动静分离以后&#xff0c;即使动态服务不可用&#xff0c;静态资源仍不受影响。 动静分离示意图 动静分离…

抉择IT工单管理系统:SaaS云部署VS本地部署,亿发解读优势与成本

在选择IT运维工单系统时&#xff0c;企业经常需要考虑部署在公有云&#xff08;SaaS&#xff09;还是本地部署。实际上&#xff0c;两种部署方法都有各自的优势&#xff0c;企业应该综合考虑自身的资金成本、安全性需求和便捷性等因素。那么SaaS云部署和本地部署有什么区别呢&a…

ST32/GD32——UART串口通信

芯片选型 Ciga Device — GD32F470系列 串口通信 串口通信指的是通过串行通信接口进行数据传输的通信方式&#xff0c;通常用于短距离、低速率的数据传输。 串口通信可以使用不同的串行通信协议和接口&#xff0c;常见的串口通信协议有UART、USART、RS-232、RS-485、SPI、I…

为什么阿里不推荐使用 keySet() 遍历HashMap?

引言 HashMap相信所有学Java的都一定不会感到陌生,作为一个非常重用且非常实用的Java提供的容器,它在我们的代码里面随处可见。因此遍历操作也是我们经常会使用到的。HashMap的遍历方式现如今有非常多种: 使用迭代器(Iterator)。 使用 keySet() 获取键的集合,然后通过增强…

【数仓】Hadoop软件安装及使用(集群配置)

一、环境准备 1、准备3台虚拟机 Hadoop131&#xff1a;192.168.56.131Hadoop132&#xff1a;192.168.56.132Hadoop133&#xff1a;192.168.56.133 本例系统版本 CentOS-7.8&#xff0c;已安装jdk1.8 2、hosts配置&#xff0c;关闭防火墙 vi /etc/hosts添加如下内容&#x…

双运算放大器,具有较宽的工作电压范围,转换速率高。采用DIP8、SOP8两种封装形式——D4510

D4510是一块双运算放大器&#xff0c;具有较宽的工作电压范围&#xff0c;转换速率高&#xff0c;相位补偿等特性。电路能在低电源电压下:工作,电源电压范围:双电源为1V-3.5V和单电源电压为2V~7V。 主要特点&#xff1a; ● 低电压工作 ● 转换速率高 ● 动态输出范围宽 ● 封…

2093409-57-3,DBCO PEG3 NH2,可以在无铜条件下与多种含有叠氮基的分子进行反应

2093409-57-3&#xff0c;二苯并环辛炔-三聚乙二醇-胺&#xff0c;DBCO-PEG3-amine&#xff0c;DBCO PEG3 NH2&#xff0c;可以在无铜条件下与多种含有叠氮基的分子进行反应&#xff0c;能够与其他分子进行偶联 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;2093…