Linux学习笔记之9(消息队列)

Linux learning

  • 1、引言
  • 2、创建一个消息队列
  • 3、发送和接受消息
    • 3.1、发送消息
    • 3.1、接收消息
  • 4、删除一个消息队列
  • 5、例程

1、引言

消息队列(message queue)也是进程之间通信的一种方式,相比于共享内存的通信方式,消息队列也有类型的运行机制,也是在多个进程之间开辟一个内存区域,让不同进程可以访问。由于消息队列其实是通过拷贝数据的方式来储存数据的,所以效率上比共享内存低,但优点在于消息队列可以通过函数来对内存中的数据进行排序等操作。
查看系统中是否存在消息队列,可以在终端中输入一下命令。

ipcs -q

2、创建一个消息队列

创建一个消息队列用到的函数是msgget(),其函数原型如下:

int msgget(key_t key, int msgflg);

可以在shell中输入”man 2 msgget“查看其更详细的信息。

  • key:键值,可以由自己指定,也可以用ftok()函数生成,相当于给这个消息队列取一个独一无二的名字,以便于其他进程访问。
  • msgflg:指定消息队列的权限。
  • return:成功则返回消息队列的标识符,失败则返回-1。

3、发送和接受消息

3.1、发送消息

发送消息用的是msgsnd()函数,其原型如下:

int  msgsnd(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
  • msgid:消息队列的id,其实就是msgget()函数的返回值。
  • msg_ptr:存储消息的内存指针。这里要求必须是一个格式如下的结构体。
typedef struct
{
	long mtype;
	char mtext[8];			//数组的小大可以自己指定
}Msg_buf;
  • msg_sz:上述结构体中mtext的长度。
  • msgflg:指定在达到系统为消息队列限定的界限时应采取的操作。 Linux的官方说明书中有这样一段话。

If insufficient space is available in the queue, then the default behavior of msgsnd() is to block until space becomes available. If IPC_NOWAIT is specified in msgflg, then the call instead fails with the error EAGAIN.

即意味着,默认情况下,如果消息队列达到上限的时候,默认的操作是让该函数进入阻塞。而如果msgflg被设定为IPC_NOWAIT,则如果达到上限,那么直接抛出报错信息。

  • return:成功则返回0,失败则返回-1。

3.1、接收消息

读取消息用到的函数是msgrcv(),其原型如下。

int  msgrcv(int msgid, void *msg_ptr, size_t msgsz, long int msgtype, int msgflg);
  • msqid:消息队列标识符,也是msgget的返回值。
  • msg_ptr:指向用户自定义的缓冲区,也是指向一个结构与上文所诉一样的结构体。(但注意它和发送消息函数所用的结构体并不共享同一块内存)
  • msgsz:也是指结构体中的mtext的长度。
  • msgtype:指定请求的消息类型:
    • msgtyp=0:收到的第一条消息,任意类型。
    • msgtyp>0:收到的第一条msgtyp类型的消息。
    • msgtyp<0:收到的第一条最低类型(小于或等于msgtyp的绝对值)的消息。
  • msgflg:有两个选项可以选,IPC_NOWAIT和IPC_NOERROR。前者指示函数,没有消息则无需等待,返回ENOMSG的报错即可。后者指示函数,当个消息大小超过msgsz时,舍弃超出的部分。
  • return:成功返回0,失败返回-1。

4、删除一个消息队列

删除一个消息队列用到了msgctl()函数,从msgctl英语全称应是message control也可以窥视到,该函数应当不仅仅只有函数消息队列一个功能。事实上,它可以对消息队列的基本属性进行控制、修改。其函数原型如下:

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
  • msqid:消息队列标识符,也是msgget的返回值。
  • cmd:控制和修改消息队列。
    • IPC_RMID:删除消息队列,立即生效。
    • IPC_SET:设置消息队列的属性。
    • IPC_STAT:读取消息队列的属性。
    • IPC_INFO:读取消息队列的基本情况。
  • buf:结构很复杂,作为初学者,我暂时不像深入学习。一般我用的时候直接设置为0即可。
    在这里插入图片描述

5、例程

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

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

相关文章

构建BTI的编译工具支持

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击&#xff1f;什么是ROP攻击&#xff1f;区别与联系&#xff1f; 2、什么是JOP攻击&#xff1f;间接分支跳转指令&#xff1f; 3、JOP攻击的缓解技术&#xff1f;控制流完整性保护&#xff1f; 4、BTI下的JOP如何…

2024 Guitar Pro 8.1.2-27 (x64) win/mac中文激活版破解版

吉他爱好者必备神器&#xff1a;Guitar Pro v8.1.1 Build 17深度解析 随着数字音乐制作和学习的日益普及&#xff0c;越来越多的吉他爱好者开始寻找能够帮助他们提升技能、创作音乐的专业工具。在众多吉他制作软件中&#xff0c;Guitar Pro因其强大的功能和易用的界面备受推崇…

001vscode为什么设置不了中文?

VSCode中文插件安装 在VSCode中设置中文的首要步骤是安装“Chinese (Simplified) Language Pack for Visual Studio Code”扩展插件。这一过程十分简单&#xff0c;只需打开VSCode&#xff0c;进入扩展市场&#xff0c;搜索“ Chinese (Simplified) Language Pack ”然后点击…

EasyUI Jquery 学习笔记 —— Window(窗口)详细版

1. Window(窗口) 1.1 Messager 消息框 通过 $.messager.defaults 重写默认的 defaults。 消息框(messager)提供不同样式的消息框,包括警示(alert)、确认(confirm)、提示(prompt)、进展(progress)等等。所有的消息框都是异步的。用户可以在与消息框交互后使用回…

初识C++ · 类和对象(中)

目录 1 类的6个默认成员函数 2 构造函数 3 析构函数 3 拷贝构造函数 1 类的6个默认成员函数 class Date { public:private:}; 这是一个空类&#xff0c;试问里面有什么&#xff1f; 可能你会觉得奇怪&#xff0c;明明是一个空类&#xff0c;却问里面有什么。其实一点也不…

HLOOKUP函数结合数据验证实现的动态图表

小伙伴们&#xff0c;大家好啊&#xff01;今天我们分享一个使用HLOOKUP函数结合数据验证实现的动态图表技巧&#xff1b; 接下来我们具体说说操作步骤吧。 步骤1&#xff1a;选中A列的【路口车辆通过数】单元格区域&#xff0c;复制粘贴后到右边的空白区域&#xff0c;如I列…

通过调用Vcenter-Api获取Vcenter中服务器信息

通过调用Vcenter-Api获取Vcenter中服务器信息 文章目录 通过调用Vcenter-Api获取Vcenter中服务器信息1. 获取Vmware API帮助文档2. 获取访问凭证3. 获取服务器清单4. 获取服务器更多信息5. 获取虚机更多信息6. 获取磁盘信息7. 获取操作系统相关 1. 获取Vmware API帮助文档 htt…

建模设计软件 Archicad 27 for mac激活版

在建筑设计领域&#xff0c;每一次技术的革新都意味着设计效率和质量的飞跃。Archicad 27 for Mac&#xff0c;就是这样一款引领行业变革的设计软件。 Archicad 27凭借出色的性能优化和强大的功能更新&#xff0c;为Mac用户带来了前所未有的建筑设计体验。它支持BIM&#xff08…

深入理解Cortex-M7 SVC和PendSV

1前言 1.1 PendSV 在ARM V7上&#xff0c;PendSV用来作为RTOS调度器的御用通道&#xff0c;上下文切换&#xff0c;任务调度都是在其ISR中实现的。所谓pend&#xff0c;字面意思即有悬起等待的意思&#xff0c;ARM官方也明确说明&#xff0c;PendSV应该在其他异常处理完毕后执…

GPT国内怎么用?4月最新版本来了

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

Datax,hbase与mysql数据相互同步

参考文章&#xff1a;datax mysql 和hbase的 相互导入 目录 0、软件版本说明 1、hbase数据同步至mysql 1.1、hbase数据 1.2、mysql数据 1.3、json脚本&#xff08;hbase2mysql.json&#xff09; 1.4、同步成功日志 2、mysql数据同步至hbase 1.1、hbase数据 1.2、mysql…

Linux 快问快答

如果对于找 Java 后端开发的话&#xff0c;我感觉会这几个差不多了&#xff0c;面试官应该不会问的这么详细吧。一般就问问 Linux 的几个常用的命令&#xff0c;然后做一些简单的性能排查就好了。如果面试被问到另外的问题&#xff0c;那我再补充进来&#xff0c;现在先掌握这么…

ZISUOJ 数据结构-线性表

题目列表&#xff1a; 问题 A: 逆序链表建立 思路&#xff1a; 可以使用头插法插入所有元素后正序遍历输出或者使用尾插法逆序遍历&#xff0c;推荐使用双链表。这是链表系列的第一个题&#xff0c;那这个题下面的参考题解的各种解法我会尽可能写全一些。 参考题解1&#xff0…

《前端面试题》- JS基础 - 防抖和节流

在界面触发点击&#xff0c;滚动&#xff0c;输入校验等事件时&#xff0c;如果对事件的触发频率不加以限制&#xff0c;会给浏览器增加负担&#xff0c;且对用户不友好。防抖和节流就是针对类似情况的解决方案。 防抖 防抖(debounce)&#xff1a;当连续触发事件时&#xff0…

攻防世界:level2[WriteUP]

用checksec、file命令查看文件属性与防护 32位小端序二进制文件 把文件丢进IDA进行逆向分析 在main函数中可以看到一个vulnerable_function函数&#xff1a;易受攻击的函数 双击该函数名称查看里面的内容 按F5显示vulnerable_function的伪代码 可以看到v1数组长度136但最后…

什么是JAVA面向对象

一&#xff0c;什么是面向对象&#xff1a; 我们以前的项目都是面向过程的&#xff0c;一个完整的项目所有的代码都写在一个类里 这就叫面向过程。 面向对象&#xff0c;是指在写大型项目时&#xff0c;多人分工合作&#xff0c;为了代码看上去简洁美观&#xff0c;会将不同的…

量子信息产业生态研究(一):关于《量子技术公司营销指南(2023)》的讨论

写在前面。量子行业媒体量子内参&#xff08;Quantum Insider&#xff09;编制的《量子技术公司营销指南》是一本实用的英文手册&#xff0c;它旨在帮助量子科技公司建立有效的营销策略&#xff0c;同时了解如何将自己定位成各自的行业专家。本文对这篇指南的主要内容进行了翻译…

ubuntu安装vulnhub

文章目录 1.下载docker2.申请加速器3.安装pip4.安装docker-compose5.安装git6.安装vulnhub文件7.运行vulhub中的靶机TypeError: kwargs_from_env() got an unexpected keyword argument ssl_version报错8.tomcat-----CVE-2017-12615(任意文件上传)1.访问192.168.9.101:80802.bp…

C++实现AVL树

文章目录 一、平衡树的优势二、二叉平衡搜索树的节点定义三、二叉搜索树的插入3.1 寻找插入位置3.2 开始判定平衡因子&#xff0c;平衡因子有变就开始旋转3.2.1 左旋的情况3.2.2 左旋代码&#xff08;一定要考虑平衡因子为2或者-2的节点是否有父节点&#xff09;3.2.2 右旋的情…

mmdetection模型使用mmdeploy部署在windows上的c++部署流程【详细全面版】

0. 前置说明: 该文档适用于:已经使用mmdetection训练好了模型,并且完成了模型转换。要进行模型部署了。 1. 概述 MMDeploy 定义的模型部署流程,如下图所示: 模型转换【待撰写,敬请期待…】 主要功能是:把输入的模型格式,转换为目标设备的推理引擎所要求的模型格式…