进程间通信 消息队列 函数用法介绍

Linux的消息队列是一种在进程间传递消息的数据结构。它允许一个进程将一条消息放入队列,而其他进程可以从队列中取出并处理消息。消息队列在实现进程间通信(IPC)方面非常有用。

IPC对象

IPC(InterProcess Communication) 对象是活动在内核级别的一种进程间通信的工具。IPC对象可以是消息队列、信号量或共享存储器中的任意一种类型。IPC对象通过标识符来引用和访问,这个标识符是一个非负整数,它唯一的标识了一个IPC对象。在Linux系统中,IPC对象的标识符被声明为整数,所以可能存在的最大标识符为65535。IPC对象删除或创建时相应的标识符的值会不断增加到最大的值,归零循环分配使用。如果用户需要使用IPC对象进行进程之间的通信,首先必须要为IPC对象申请对应资源(key值、ID号)。例如使用消息队列来通信,那么就必须为消息队列申请key值与ID号。

查看IPC对象。

命令:ipcs [-asmq]

选项功能
-a查看全部IPC对象信息
-m查看共享内存
-q查看消息队列
-s查看信号量集
  • IPC标识符

    内核分配给IPC对象,在系统内部唯一

  • IPC键(key)

    • IPC对象的外部表示,由程序员选择
    • IPC关键字是一个32位长整型数据,全局唯一
    • 通过同一个键,不同的进程可以访问同一个IPC对象
    • 每个进程都可以创建一个键值为IPC_PRIVAE的私有IPC对象
    • 可以通过调用函数ftok产生一个唯一的键值

ftok函数原型:

#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(char* filename, int id);

参数说明:

  • filename:文件名,可以使用绝对路径相对路径
  • id:整型变量。

返回值:

  • 调用成功,返回生成的键值key
  • 调用失败,返回-1

消息队列

消息队列(Message Queue)是一种进程间通信或同一进程的不同线程间通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数。消息队列中的消息是先进先出(FIFO)的数据结构,也就是说,最先进入队列的消息将会最先被取出。每个消息队列都有一个最大长度,一旦达到最大长度,后续的入队操作将会失败。

消息队列是在消息的传输过程中保存消息的容器。它允许应用程序通过发送和接收消息来进行通信,这些消息按照它们到达的顺序存储在队列中。消息队列的主要目的是提供路由并保证消息的传递,如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

消息队列在分布式系统中扮演着重要的角色,它们允许不同的应用程序或不同的组件之间进行通信和协作。通过使用消息队列,应用程序可以解耦和异步处理数据流,从而提高系统的可靠性和性能。

消息队列是:

  • 存储消息的链表
  • 消息队列中的每个消息可以视为一条记录
  • 新添加的消息总是在队尾,接收消息的进程可以读取队列中间的数据
  • 消息队列可实现无亲缘关系进程间的通信

消息结构

消息结构模板msgbuf

struct msgbuf
{long msgtype; // 消息的类型, 长整型变量char mtext[1]; // 消息的内容,字符串数组
}

该结构只是一个模板,在实际的编程中,可以根据该模板自行定义消息的长度。

消息队列通信的步骤

  1. 创建消息队列 msgget()
  2. 向消息队列发送消息 msgsnd()
  3. 从消息队列读取消息 msgrcv()
  4. 删除消息队列 msgctl()

msgget()

函数原型:

#include <sys/types.h>
#include <sys/msg.h>
int msgget(key_t key, int flags);

参数说明:

  • key:键值
    • 可以通过ftok函数产生
    • IPC_PRIVATE:创建当前进程的私有消息队列
  • flags:标识和权限信息的组合
    • IPC_CREAT:如果消息队列不存在,则创建一个新的队列;如果消息队列存在,则引用已存在的消息队列
    • 0:获取一个已存在的消息队列的标识符

返回值:

  • 调用成功,返回消息队列的标识符
  • 调用失败,返回-1

msgsnd()

函数原型:

#include <sys/types.h>
#include <sys/msg.h>
int msgsnd(int msqid, struct msgbuf* msgp, size_t size, int flag);

参数说明:

  • msqid:消息队列的标识符
  • msgp:指向消息结构指针
  • size:消息内容的长度
  • flag:发送消息可选标志
    • 0:当消息队列已满时,消息的发送操作阻塞,直到有进程从队列中读出消息
    • IPC_NOWAIT:当消息队列满时,进程不阻塞,立即返回-1

返回值:

  • 调用成功,返回0
  • 调用失败,返回-1

msgrcv()

函数原型:

#include <sys/types.h>
#include <sys/msg.h>
int msgrcv(int msqid, struct msgbuf* msgp, size_t size, long type, int flag);

参数说明:

  • msqid:消息队列的标识符
  • msgp:消息结构指针
  • size:要读取消息的长度
  • type:要读取消息的类型
  • flag:接收消息可选标志
    • 0:当消息队列为空时,进程阻塞
    • IPC_NOWAIT:表明当消息队列空时,进程不阻塞,立即返回-1
    • MSG_NOERROR:允许消息长度大于接收缓冲区长度,截断消息返回;否则,不接受该消息,出错返回

返回值:

  • 调用成功,返回实际读取到的消息的字节数
  • 调用失败,返回-1

msgctl()

函数原型:

#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds* buf);

参数说明:

  • msqid:消息队列的标识符
  • buf:指向msqid_ds结构的指针
  • cmd:控制命令
    • IPC_RMID删除消息队列
    • IPC_STAT获取消息队列的msqid_ds结构,保存于buf所指向的缓冲区
    • IPC_SET设置消息队列的msqid_ds结构,按照buf指向的结构的值

返回值:

  • 调用成功,返回0
  • 调用失败,返回-1

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

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

相关文章

Fiddler抓包工具之fiddler设置过滤

fiddler设置过滤 基本的过滤操作流程以百度为例 步骤&#xff1a; 1、右侧高级工具栏点击Filters》勾选Use Filters》选择Show only Internet Hosts和Show only the following Hosts》在文本框中输入host地址 2、点击Changes not yet saved》再点击Actions》Run Filterset …

Azure Machine Learning - 在 Azure AI 搜索中创建全文查询

Azure AI搜索中如果要为全文搜索生成查询&#xff0c;本文提供了设置请求的步骤。 本文还介绍了查询结构&#xff0c;并说明了字段属性和语言分析器如何影响查询结果。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&a…

RISC-V_WCH系列微控器软件体系云端快速架构

1 概述 RISC-V内核的微控器MCU&#xff0c;正在以更高的性价比&#xff0c;快速取代传统的各类ARM系列微控制处理器。 针对常用的芯成RISC-V内核的泌恒WCH系列微控器MCU&#xff0c;推出了&#xff1a;RISC-V_WCH系列微控器软件体系快速架构云平台。只要以身份证号码做用户名…

C#拼夕夕自动化登录,电商网页自动化操作。WebView2

单纯靠WebView2是没办法通过JS实现自动登录操作的&#xff0c;包括浏览器插件&#xff0c;都不行&#xff0c;因为大公司对反爬机制控制的还是挺严格。 下面是实现效果&#xff0c;私信我&#xff0c;咨询解决方案。 20231202_153912 C#有偿Q群&#xff1a;927860652博客仅为…

交换综合实验

目录 一、实验拓扑 二、实验要求 三、实验步骤 1、链路聚合&#xff08;配置Eth-trunk&#xff09; 2、配置vlan&#xff08;创建划分vlan&#xff0c;配置trunk干道&#xff09; 3、MSTP配置 4、VRRP配置 5、DHCP配置 6、vlan互通 7、NAT配置&#xff08;做ACL&#…

idea 旧项目替换成新项目(项目名称,模块,代码)

文章目录 修改项目名全局替换包名替换模块、文件前缀&#xff08;一定要先替换包名&#xff09;局部替换xml、yml等其他文件修改本地项目文件夹名称修改git配置 修改项目名 右击项目名称->Refactor->Rename(shiftF6) ctrlaltshifts 全局替换包名 全局选中包名替换&…

C++入门篇第十篇----继承

前言&#xff1a; 本篇我们将开始讲解C的继承&#xff0c;我想要说的是&#xff0c;C的主体基本就是围绕类和对象展开的&#xff0c;继承也是以类和对象为主体&#xff0c;可以说&#xff0c;C相较于C优化的地方就在于它对于结构体的使用方法的高度扩展和适用于更多实际的场景…

如何查看linux块大小

1.fdisk -l 查看块大小&#xff1a; [rootlocalhost alice]# fdisk -l Disk /dev/sda&#xff1a;300 GiB&#xff0c;322122547200 字节&#xff0c;629145600 个扇区 单元&#xff1a;扇区 / 1 * 512 512 字节 扇区大小(逻辑/物理)&#xff1a;512 字节 / 512 字节 I/O 大小…

go使用aes加密算法

工具代码 package toolimport ("bytes""crypto/aes""crypto/cipher" )// AES加密函数 var key []byte []byte("0#3456789ABCDEF") //todo 记住这个长度只能是16 24 32 如果不是的话话会报错 func Encrypt(data []byte) ([]byte, er…

说一说MySQL中的锁机制

说一说MySQL中的锁机制 按粒度大小从大到小分为 全局锁 全局锁 全局锁是对整个数据库的锁&#xff0c;最常用的全局锁就是读写锁 读锁 阻止其他用户更新数据&#xff0c;允许其他用户读数据写锁 阻止其他用户更新和读数据 修改一些大量的数据&#xff0c;并且不希望其他用户…

Java语法之字符串类型

String类 在Java中&#xff0c;使用String类定义字符串类型&#xff0c;如下&#xff1a; String s1"hello";System.out.println(s1); 字符串拼接 只要s1s2即可 在字符串中&#xff0c;如果俩个字符串进行相加&#xff0c;那他就是字符串拼接的意思 补充 如上&am…

ARM架构基础简介

目录 一、概述 二、关于ARM架构 三、我们所说的架构是什么意思? 四、系统架构

c++异常介绍

一 . C语言传统的处理错误的方式 1. 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。2. 返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的错误。 二 . C异常概念及使用 当一个…

6.7 Windows驱动开发:内核枚举LoadImage映像回调

在笔者之前的文章《内核特征码搜索函数封装》中我们封装实现了特征码定位功能&#xff0c;本章将继续使用该功能&#xff0c;本次我们需要枚举内核LoadImage映像回调&#xff0c;在Win64环境下我们可以设置一个LoadImage映像加载通告回调&#xff0c;当有新驱动或者DLL被加载时…

Android监听用户的截屏、投屏、录屏行为

Android监听用户的截屏、投屏、录屏行为 一.截屏 方案一&#xff1a;使用系统广播监听截屏操作 ​ 从Android Q&#xff08;10.0&#xff09;开始&#xff0c;Intent.ACTION_SCREEN_CAPTURED_CHANGED字段不再被支持。这是因为Google在安卓10 中引入了一个新的隐私限制&#…

zookeeper实操课程Acl 访问权限控制,命令行测试

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper。阅读本文之前&#xff0c;请先阅读----​​​​​​zookeeper 单机伪集群搭建简单记录&#xff08;实操课程系列&#xff09;。 阅读本文之前&#xff0c;请先阅读…

Oauth2.0 学习

OAuth 2.0 服务器端通常通过验证每次请求中的访问令牌&#xff08;access token&#xff09;的方式来确保其合法性和有效性。以下是一些通常采用的验证方法&#xff1a; Token Validation Endpoint: OAuth 2.0 规范允许实现一个专门的令牌验证端点&#xff0c;称为 Token Valid…

ipvlan介绍

最近使用docker&#xff0c;涉及到需要跨多台物理机部署系统&#xff0c;查了好多资料&#xff0c;最后查到了ipvlan。那什么是vlan&#xff0c;什么又是ipvlan。 交换机层面的vlan&#xff0c;是按802.1Q规范&#xff0c;在链路层中加了4字节的标识vlan的数据&#xff0c;交换…

YUVRGB

一、直观感受 根据上面的图片&#xff0c;不难看出&#xff1a; RGB的每个分量&#xff0c;是对当前颜色的一个亮度值Y分量对呈现出清晰的图像有着很大的贡献Cb、Cr分量的内容不太容易识别清楚YUV将亮度信息&#xff08;Y&#xff09;与色度信息&#xff08;UV&#xff09;分离…

深入理解原码、反码、补码(结合C语言)

一、引出问题 在学习C语言单目操作符中~按位取反的过程中&#xff0c;对这样一段代码的结果产生了疑惑&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 0;int b ~a;//按位取反printf("%d\n", b);return 0; }输出结果…