System V 消息队列(一)—— 消息队列相关接口函数(msgget / msgctl)

news2024/11/24 11:59:32

SystemV方案是在OS内核层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口。SystemV方案包含三种:共享内存、消息队列、信号量。

和System V 共享内存一样,OS为了管理这些消息队列,给每个消息队列配上了标识唯一性的编号msgid。消息队列中的消息则是以链表的形式被管理的


        目录

1、ftok

2、msgget 

3、msgsnd

4、msgrcv

5、msgctl


1、ftok

System V共享内存里也用到了这个函数,该函数的作用是生成一个具有唯一性的ID。这里的ID不是消息队列的ID,因为消息队列是一份临界资源,为了避免该消息队列被无关线程访问,所以设置了房间密码,ftok的返回值则是 “ 房间密码 ”。

 ftok函数的第一个参数:路径名

 ftok函数的第二个参数:项目ID

返回值:成功返回具有唯一性的“房间密码”;失败返回 -1

关于这个函数无需想的太复杂,简单来说就是,从路径名中取出一部分,然后再从ID中取出一部分,最后再把两部分组合一下形成一个整数,我们就把这个整数当作“房间密码”

注意:ftok被不同进程调用,只要路径名和ID是一样的,生成的整数就是一样的

2、msgget 

msgget函数的作用是通过上面的得到的房间密码创建一个消息队列 或者 拿到已有消息队列的ID

第一个参数 key:“房间密码”

第二个参数 msgflag:创建消息队列的方式,同时设置权限

返回值:成功返回消息队列id,失败返回 -1

 类似于write函数的第二个参数,属于位运算输入

IPC_CREAT:可以单独使用,如果共享内存不存在,则重新开辟,函数返回值是新开辟的共享内

                        存的ID;如果已经存在,则沿用已有的共享内存,函数返回值是已有的共享内存的

                        ID

IPC_EXCL:无法单独使用,要配合IPC_CREAT使用,即 IPC_CREAT | IPC_EXCL

IPC_CREAT | IPC_EXCL:如果共享内存不存在,则重新开辟,函数返回值是新开辟的共享内

                                        存的ID;如果已经存在,则报错

IPC_CREAT | IPC_EXCL | 0664:开辟共享内存的同时,设置共享内存的访问权限

key_t key = ftok(".", 100);

// 如果消息队列不存在 (0664 —— rw-rw-r--)
int msghid = msgget(key, IPC_CREAT | IPC_EXCL | 0664);
// 如果消息队列已存在
int msghid = msgget(key, IPC_CREAT);

3、msgsnd

msgsnd函数的作用是向消息队列中添加一条消息。

第一个参数 msgid:消息队列ID,即msgget函数的返回值

第二个参数 msgp: 消息缓冲区的地址,也就是你要向消息队列中添加的消息,需要满足一定的格式。消息格式如下:

struct msgbuf {
    long mtype;       /* message type, must be > 0 */  // 
                      // 消息类型,在从消息队列取出消息的时候,可以根据消息类型来选择性地取消息
    char mtext[1];    /* message data */
                      // 消息内容
};

第三个参数 msgsz:表示消息长度。这里的消息长度指的是上面这个结构体中buf成员所占字节数

第四个参数 msgflag:表示发送消息的方式。可选值如下:

可选值含义
0当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列
IPC_NOWAIT

当消息队列已满的时候,msgsnd函数不等待立即返回,此时是以报错的形式返回。

返回值:成功返回0,失败返回-1                                  

4、msgrcv

msgrcv函数的作用是从消息队列的队头取出一条消息。

第一个参数 msgid:消息队列id

第二个参数 msgp:输出型参数,表示消息缓冲区的地址。也就是你要把取出来的消息放在哪,同样需要使用指定格式。(数据格式详见msgsnd函数)

第三个参数 size:指定接收的消息长度。单位是字节。

第四个参数 msgtype:选择想要取出的消息类型(虽然叫做消息队列,但是不一定就是取出队头元素,也可以是取出具有相同消息类型中的第一个消息)。主要分为以下三种情况:

msgtype的值解析
msgtype = 0直接取出队头消息,不论是什么类型
msgtype > 0从所有消息类型为msgtype的消息中,取出其中的第一条消息
msgtype < 0接收类型小于等于 msgtype的绝对值的第一条消息。

补充:针对msgtype < 0做一些补充,假设消息队列里的消息类型有 1、3、4、5 四种类型的消息,如果msgtype = -4,绝对值是4,那就需要取出消息类型小于等于4的所有消息,因此,取出消息的消息类型必须是1、3、4类型。

第五个参数 msgflag:表示接收消息的方式。可选值如下:

可选值含义
0阻塞式接收消息
IPC_NOWAIT如果消息队列中没有消息,则立马返回,此时错误码为ENOMSG
MSG_EXCEPT与msgtype配合使用,返回队列中第一个类型不为msgtype的消息

5、msgctl

msgctl 函数的作用是控制消息队列,可以用来销毁消息队列。

第一个参数msgid:消息队列id

第二个参数cmd:对消息队列执行的具体操作,如拷贝、查询、销毁等。可选值如下:

可选值含义
IPC_STAT将消息队列的相关信息拷贝放到第三个参数 buf 中
IPC_RMID销毁消息队列

第三个参数 buf:消息队列缓冲区。比如 cmd 为IPC_STAT时,会把消息队列的相关信息拷贝到该缓冲区中。

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

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

相关文章

【机器学习实战】对加州住房价格数据集进行数据探索(读书笔记)

1. 数据集描述及获取 数据集下载地址&#xff1a;housing.csv数据集的结构&#xff1a; 其中数据集有10个属性&#xff0c;分别为经度、纬度、housing_median_age、房间总数、卧室总数、人口数、家庭数、收入中位数、房价中位数、ocean_proximity。 2. 对数据集进行探索 2.…

web系统开发中关于企业里各种系统分类

关于企业里各种系统 OA 办公自动化系统 Office Automation &#xff08;将现代化办公和计算机网络功能结合起来的新型办公方式&#xff09; 功能&#xff1a;工作流、知识管理 功能模块&#xff1a;日报、考勤、事项审批等CRM 客户关系管理 Customer Relationship Management&…

C++日期和时间编程小结

C11 的日期和时间编程内容在 C Primer(第五版)这本书并没有介绍&#xff0c;目前网上的文章又大多质量堪忧或者不成系统&#xff0c;故写下这篇文章用作自己的技术沉淀和技术分享&#xff0c;大部分内容来自网上资料&#xff0c;文末也给出了参考链接。 日期和时间库是每个编程…

百度前端二面常考面试题

HTTP分层 第一层&#xff1a;物理层&#xff0c;TCP/IP 里无对应&#xff1b;第二层&#xff1a;数据链路层&#xff0c;对应 TCP/IP 的链接层&#xff1b;第三层&#xff1a;网络层&#xff0c;对应 TCP/IP 的网际层&#xff1b;第四层&#xff1a;传输层&#xff0c;对应 TCP…

编写递归函数,求斐波那契数列第n项

要求&#xff1a;编写递归函数int f(int n)&#xff0c;计算如下公式&#xff1a; 定义main函数输入n&#xff0c;调用f函数进行计算&#xff0c;在main函数中输出计算结果。 【样例输入】 10 【样例输出】 89 主函数&#xff1a; #include<stdio.h> int main() { in…

基于ssm的社区疫情返乡管控系统设计实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

C# 学习之路(类型、存储和变量)

C# 学习之路&#xff08;类型、存储和变量&#xff09; C# 是一组类型声明 如果泛泛的描述 C 和 C 程序源代码的特征&#xff0c;可以说 C 程序是一组函数和数据类型&#xff0c;C 是一组函数和类&#xff0c;而 C# 程序是一组类型的声明。 命名空间是一种将相关的类型声明分组…

mongodb 5.0.14 副本集 安装 单机版 记录

1、下载tgz 连接地址&#xff1a;mongodb 5.0.14下载 2、创建用户 useradd mongouserpasswd mongouser 3、解压tgz wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.14.tgz tar -zxvf mongodb-linux-x86_64-rhel70-5.0.14.tgz 4、拆分3个独立的mo…

编程团体赛

目录 1047:编程团体赛 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路: 代码: 时间复杂度: 总结: 题目链接: 1047:编程团体赛 编程团体赛的规则为&#xff1a;每个参赛队由若干队员组成&#xff1b;所有队员独立比赛&a…

Protocol buffe vs Json 为什么还会大量使用Json?

JSON&#xff1a;的最大优点就是可读性好&#xff0c;但是体积大。 Protocol Buffers&#xff1a;最大的特点就是体积小&#xff0c;传输需要带宽小&#xff0c;速度快。但是可读性较差 尽管JSON和Protobuf消息可以互换使用&#xff0c;但这些技术的设计目标不同。JSON代表Ja…

【元胞自动机】格子波尔兹曼模型及其应用研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

我去!Python 不愧是脚本之王,这 23 种命令行用法你全部 get 了吗?

1. 快速打印函数的调用栈 在阅读源码的时候&#xff0c;有时候我们想要看整个程序的调用栈是怎样的&#xff1f; 比较常规的做法是使用全局搜索函数&#xff0c;一层一层往上走&#xff0c;效率非常之低。 而我习惯了使用 pdb 对代码进行调试&#xff0c;在使用pdb时&#x…

vscode环境中配置git

1. 建立project空目录用于存放electron基本环境这个环境中得文件不能加入git项目中否则每次更新文件太大github不支持大于100M得文件上传 2. 使用vscode打开project目录 3.打开终端运行npm install electron 运行完成后会生成electron相关得两个json文件和一个文件夹 4.新建一个…

读取图片输出字符图案:用字符输出足球的图案

用字符输出足球的图案前言功能描述实现思路代码实现1️⃣ 获取像素点的RGB数值2️⃣ 判断每个像素点的RGB值是否符合3️⃣ main方法结果测试前言 世界杯&#xff0c;如火如荼的进行着&#xff0c;作为程序员也参加一下活动&#xff0c;蹭一下世界杯的热度 功能描述 通过读取足球…

跨行新手学习并备考阿里云云计算专业认证ACP大概需要多长时间呢?

先来了解一下阿里云认证&#xff1a; 阿里云认证是基于核心技术及岗位的权威认证&#xff0c; 阿里云针对不同产品类别、用户成长阶段、生态岗位&#xff0c;精心打造不同的认证考试。 个人&#xff1a;证明您在对应技术领域的专业度&#xff0c;能够基于阿里云产品解决实际问…

(附源码)spring boot投票系统 毕业设计 261136

基于springboot投票系统 摘 要 在科学管理机制越来越完善的今天&#xff0c;投票管理者只能依赖手工记录数据,这不仅仅浪费时间&#xff0c;并且对人力也是一种浪费&#xff0c;不能做到随时监控&#xff0c;对数据的准确性和及时性也是一种影响。所以投票非常急需一套既有与时…

Python到底适合什么后端团队和项目?

前言 1、我的Python从业经历 本人从2015年开始基本上都在使用Python语言&#xff0c;主要做扫描器、分布式任务、后台接口、AI、图像和3D点阵处理、数据接收处理等等&#xff0c;也待过几个公司&#xff0c;所在部门基本上也是多种语言的开发小组都有&#xff0c;统计了下如下…

JAVA五子棋手机网络对战游戏的设计与实现(源代码+论文)

五子棋网络对战游戏的设计与实现 论文作者姓名&#xff1a;申请学位专业&#xff1a;申请学位类别&#xff1a;指导教师姓名&#xff08;职称&#xff09;&#xff1a;论文提交日期&#xff1a; 五子棋网络对战游戏的设计与实现 摘 要 在现代社会中,及其它无线设备越来越多的…

铁矿行业BI经营分析框架(四)经营分析

在中国大部分的铁矿企业集团都是有央国企背景的&#xff0c;都是属于一个大集团下的二级集团性企业。所以&#xff0c;首先是需要背上集团下发的经营业绩指标的&#xff0c;这个一定是整个经营管理分析的核心要重点关注。 业绩情况 第一个分析要点就是这家企业集团在整个集团中…

Matplotlib入门[04]——处理图像

Matplotlib入门[04]——处理图像 参考&#xff1a; https://ailearning.apachecn.org/Matplotlib官网 图片来源&#xff1a;百度&#xff08;如有侵权&#xff0c;立删&#xff09; 使用Jupyter进行练习 import matplotlib.pyplot as plt import matplotlib.image as mpimg imp…