系统编程-消息队列

news2024/12/24 8:33:05

消息队列

目录

消息队列

引入

一、消息队列的特点

二、使用指令查看消息队列

三、使用消息队列进行通信的步骤

1、获取键值

2、创建或获取消息队列 id

3、使用消息队列进行数据的传输

4、msgrcv -- 从消息队列中读取数据

5、消息队列的多种操作函数


引入

-- 进程间通信 (IPC)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。

-- 这章讲消息队列

  • 相当于系统级别的链表(系统开着,消息队列在。系统关,消息队列关)-- 所有进程都可使用

  • 多个进程间进行数据传输           -- 消息队列

一、消息队列的特点

-- 类似于管道

  • (1)先进先出,数据读出来会从消息队列中消失。

  • (2)要进行消息的读取,必须有消息否则会读阻塞。

  • (3)消息队列满了,会产生写阻塞。

  • (4)有消息类型之分,用来确定读取的消息类型

-- 消息队列可以解决的问题:多个进程间进行数据的传输

二、使用指令查看消息队列

-- 指令:ipcs

  • ipas可以查看系统下的system V的状态 

    alt text

-- 指令:ipcs -q 只查看消息队列 

alt text

-- 消息队列的相关信息:

  • 键值:获取消息队列 id 的唯一标识符,一个键值对应一个消息队列的 id,是八位的十六进制,例如 0x12345678

  • msqid:用于区分不同的消息队列 也代表该消息队列的号(id)

  • 拥有者:谁创建的

  • 权限:对该消息队列的操作权限
    例:666 可读可写

  • 已用字节数:消息队列中一共存放了多少个字节的信息

  • 消息:存放了消息的个数


三、使用消息队列进行通信的步骤

alt text

1、获取键值

(1)函数获取:

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>

-- 函数原型

  • key_t ftok(const char *pathname, int proj_id)

-- 函数的作用:

  • 通过传入的参数来获取指定的键值(ftok的两个参数一样,获取的键值就一样)

-- 函数的参数:

  • pathname:必须是存在的路径
  • proj_id:0~255

-- 函数的返回值:

  • 会根据函数的参数来返回一个键值

alt text

(2)自己定义:

  • #define my_key 0x12345678

-- 键值的作用:

  • 一样的键值可以让不同进程来获取到同一个消息队列的id号
  • 一个键值对应一个id号,是一一对应的。具有唯一性。

2、创建或获取消息队列 id

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>
  • #include <sys/msg.h>

-- 函数原型

  • int msgget(key_t key, int msgflg)

-- 函数的作用:

  • 创建或获取消息队列的 id 用于进程间通信

-- 函数的参数:

  • key:键值 相同的键值可以获取相同的消息队列 id
  • msgflg:固定填写    IPC_CREAT|0666

-- 函数的返回值:

  • 成功返回 消息队列的 id >= 0
  • 失败返回 -1

alt text

alt text

3、使用消息队列进行数据的传输

-- 收发的数据类型必须为结构体

-- 函数的头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>
  • #include <sys/msg.h>

-- 函数原型

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

-- 函数的作用:

  • 向指定的消息队列中发送一条消息

-- 函数的参数:

  • msqid:要将消息发送到哪一个消息队列中去

  • msgsz:填写 mtext 的大小 ,填写:第二个参数的结构体大小 - 8

  • msgflg:填0是阻塞发送,如果消息队列空间不够,会阻塞,直到有空间可以进行写入
    -- IPC_NOWAIT 非阻塞发送

  • msgp:发送的消息的首地址

-- 这里必须要用结构体 需要自己在程序中定义(发送和接收的结构体必须定义的一模一样)

struct msgbuf {
    long mtype;
    /* message type, must be > 0 */
    char mtext[1];
    /* message data */
    xxxx;
    .....;
};

-- 结构体中的第一个成员必须为 long 类型,赋值时必须给大于 0 的值

-- 函数的返回值:

  • 成功返回 0
  • 失败返回 -1
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>

#define key 0x12345678

struct student
{
	long mtype;  -- 第一个数据类型必须是long型
	int id;
	char name[20];
};

int main()
{

	//key_t  key = ftok("/home/pimouren/learn", 55);
	printf("%x\n",key);
	
	int id = msgget(key,IPC_CREAT|0666);
	if(id == -1)
	{
		perror("msgget");
		return -1;
	}
	printf("id = %d\n",id);
	
	struct student stu;
	printf("请输入学生的学号!\n");
	scanf("%d",&stu.id);
	printf("请输入学生的名字!\n");
	scanf("%s",stu.name);
	
	int  mm = msgsnd(id, &stu,sizeof(stu)-8, 0);
	if(mm == -1)
	{
		perror("msgsnd");
		return -1;
	}
	
	
	return 0;
}

alt text

-- 再次向消息队列中写入数据,已用字节数发生改变

alt text

4、msgrcv         -- 从消息队列中读取数据

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>
  • #include <sys/msg.h>

-- 函数的原型

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

-- 函数的作用:

  • 从消息队列中进行数据的读取

-- 函数的参数:

  • msqid:要从哪一个消息队列读取消息
  • msgp:读取到的消息保存的首地址
  • msgsz:要读取的消息字节数,填写结构体大小 - 8
  • msgtyp:要接受的消息类型

"> 0"
-- 接收指定的消息类型中的第一条消息
"0"
-- 接收消息队列中的第一条消息
"<0"
-- 接收小于 msgtyp 绝对值的消息类型
例如 填写-3, |-3| == 3 ,那么可以读取 1 或2 的消息类型

  • msgflg: 0 阻塞接收 如果没有 msgtyp 指定消息类型会一直阻塞 直到有该消息类型来到 IPC_NOWAIT 非阻塞

-- 函数的返回值:

  • 成功返回 实际读取到的字节数
  • 失败返回 -1

alt text

alt text

alt text

5、消息队列的多种操作函数

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/ipc.h>
  • #include <sys/msg.h>

-- 函数原型

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

-- 函数的作用:

  • 对消息队列进行多种操作 例如:获取消息队列的信息, 更改消息队列设置, 删除消息队列

-- 函数的参数:

  • msqid:消息队列的 id 你要对哪一个消息队列进行操作
  • cmd:要进行的具体操作

IPC_STAT 获取消息队列的信息
IPC_SET 更改消息队列的设置
IPC_RMID 删除消息队列
当 cmd 为 IPC_RMID 时 第三个参数给 NULL buf:结构体指针 用于传出和设置消息队列属性

-- 函数的返回值:

  • 成功 返回 0
  • 失败 返回 -1

-- 这个函数主要用来删除消息队列

alt text

-- 使用指令删除消息队列

  • 指令:ipcrm -q msgid

alt text

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

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

相关文章

一、undo log、Buffer Pool、WAL、redo log

目录 1、undo log2、Buffer Pool3、WAL4、redo log5、总结6、问题 1、undo log undo log日志是一种用于撤销回退的逻辑日志&#xff0c;在事务未提交前会记录相反的操作到undo log&#xff0c;当事务回滚&#xff0c;使用undo log 进行回滚&#xff0c;保证了事务的原子性。MV…

Golang 深入理解 GC

垃圾是指程序向堆栈申请的内存空间&#xff0c;随着程序的运行已经不再使用这些内存空间&#xff0c;这时如果不释放他们就会造成垃圾也就是内存泄漏。 垃圾回收 (Garbage Collection&#xff0c;GC) 是编程语言中提供的自动的内存管理机制&#xff0c;自动释放不需要的内存对象…

【Qt】Qt系统 | Qt事件 | 定时器

文章目录 定时器QTimerEventQTimer获取系统日期及时间 定时器 Qt 中在进行窗口程序的处理过程中&#xff0c;经常要周期性的执行某些动作&#xff0c;或者制作一些动画效果&#xff0c;使用定时器可以实现这些需求。 定时器&#xff0c;会在间隔一定时间后&#xff0c;执行某一…

八岁编程小天才:45分钟挑战AI极限,聊天机器人一鸣惊人

一位8岁的小女孩&#xff0c;用短短45分钟就搭建出了一个聊天机器人&#xff0c;吸引了180万人的在线围观。 Cursor&#xff0c;这款被Cloudflare副总裁家8岁女儿青睐的AI代码编辑器&#xff0c;成为全网热议的焦点。 甚至许多网友出来发话力挺。 AI编程&#xff0c;从复杂到简…

swagger,Knife4j和Yapi

目录 swagger swagger的作用 swagger的使用 一.导入依赖 二.创建swagger配置类&#xff0c;交给SpringIoC容器管理 三.使用swagger依赖的注解来给接口层(controller)的各种方法进行注释 Api ApiOperation ApiImplicitParam ApiModel ApiModelProperty 四&#xff1a;…

【layUI】点击导出按钮,导出excel文件

要实现的功能如下&#xff1a;根据执行状态判断是否可以导出。如果可以导出&#xff0c;点击导出&#xff0c;在浏览器里下载对应的文件。 代码实现 html里&#xff1a; <table class"layui-hide" id"studentTable" lay-filter"studentTable&…

vue2表单校验:添加自定义el-form表单校验规则

前言 在vue2表单校验&#xff1a;el-form表单绑定数组并使用rules进行校验_vue2 rules校验-CSDN博客中&#xff0c;使用form原生的rules对表单中每个控件的必填、格式等做了校验。但是保存时&#xff0c;除了验证每一个控件的输入合乎要求外&#xff0c;还需要验证控件之间的数…

八、DMA直接存储器存取

1、DMA简介 DMA是一个数据转运小助手&#xff0c;用来协助CPU完成转运的工作 2、存储器映像 计算机系统的5大组成部分&#xff1a;运算器、控制器、存储器、输入设备、输出设备 运算器和控制器&#xff0c;合称CPU 计算机的核心关键部分是CPU和存储器 存储器涉及&#xff…

带你深入浅出新面经:十五、十大排序之堆排序

此为面经第十五谈&#xff01;关注我&#xff0c;每日带你深入浅出一个新面经。 我们要了解面经要如何“说”&#xff01; 很重要&#xff01;很重要&#xff01;很重要&#xff01; 我们通常采取总-分-总方式来阐述&#xff01;&#xff08;有些知识点&#xff0c;你可以去…

Linux--find命令-搜索

find 命令 用来在指定目录下查找文件 如果使用该命令时&#xff0c;不设置任何参数&#xff0c;则find命令将在当前目录下查找子目录与文件&#xff0c;并且将查找到的子目录和文件全部进行显示 find <指定目录> <指定条件> <指定动作> 默认是搜索当前目录…

C语言:编程世界的基石

在计算机科学的世界里&#xff0c;C语言就像一座坚固的桥梁&#xff0c;连接着硬件和软件的两端。自从20世纪70年代诞生以来&#xff0c;C语言以其简洁、高效和强大的特性&#xff0c;成为了编程领域的经典之作。本文将探讨C语言在不同工作领域中的应用&#xff0c;以及它为何能…

opensatck上windows云主机上java服务的端口调用问题处理

文章目录 前言一、思路二、解决步骤1.将安全组规则全部放开2.云主机内部防火墙关闭3.尝试telnet4.查看代码&#xff0c;修改IP配置 总结 前言 opensatck上windows云主机上java服务的端口调用问题处理。同事在window10的云主机中用idea起了调试中的服务&#xff0c;端口在8000&…

鸿蒙操作系统为前端开发者带来下一个风口

在科技飞速发展的当下&#xff0c;前端开发领域也在不断寻求新的突破和机遇。而鸿蒙操作系统的崛起&#xff0c;无疑为前端开发者带来了下一个令人瞩目的风口。 一、鸿蒙系统的独特优势 1. 分布式架构 鸿蒙系统的分布式架构打破了传统设备之间的界限&#xff0c;使得不同设备可…

了解如何使用 Google 的 Gemini-1.5-pro 最新模型开发用于卡路里计算的生成式 AI 应用

欢迎来到雲闪世界。 例如&#xff0c;你有没有想过&#xff0c;当你吃晚餐时&#xff0c;你摄入了多少卡路里&#xff1f;我经常这样做。如果你能简单地通过应用程序发送一张你的盘子照片&#xff0c;并在你决定要吃多少之前得到卡路里总量的估计值&#xff0c;那不是很棒吗&am…

springboot依赖之JDBC(二)

要在 IntelliJ IDEA 中创建一个 Spring Boot 项目并实现基于 JdbcTemplate 的增删改查功能&#xff0c;以下是一个详细的步骤和代码示例。这个例子使用一个简单的用户信息表&#xff08;users&#xff09;&#xff0c;并展示如何使用 JdbcTemplate 的各种方法进行操作。 前文有…

【Linux —— 生产者消费者模型】

Linux —— 生产者消费者模型 生产者消费者模型概述生产者消费者模型特点生产者消费者模型优点基于BlockingQueue的生产者消费者模型 生产者消费者模型概述 生产者消费者模型是一种并发编程模型,用于解决多线程或多进程间的数据共享和同步问题。在这个模型中,有两种角色:生产者…

Python 3.11 从入门到实战1(环境准备)

本篇文章是python3.11的学习开篇&#xff0c;我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;获得python基础学习与实例、实践相结合&#xff0c;使我们完全掌握python。并做到独立完成项目开发的能力。 今天的谈论的比较简单&#xff0c;也是后续学习的基础。pyt…

深入MySQL

MySQL逻辑架构 MySQL逻辑架构整体分为三层&#xff0c;顶层客户端并非MySQL独有&#xff0c;如&#xff1a;连接处理、授权认证、安全等功能都在客户端层。 核心服务层&#xff0c;MySQL大多数核心服务都在这一层&#xff0c;包括查询解析、分析、优化、缓存、内置函数等。所有…

Python中csv文件的操作5

在《Python中csv文件的操作1》中提到&#xff0c;可以通过read()和write()方法读取和写入csv文件中的所有内容。除了上述的两个方法外&#xff0c;还可以通过readline()、readlines()、writelines()实现csv文件的读写操作。 1 readline()方法 readline()方法每次只读取文件的…

入行「游戏策划」,该从何处下手?

想知道策划岗位该怎么入行可点击蓝链 相比较起以技术为最重要评判标准的开发岗&#xff0c; 「游戏策划」这一岗位在非业界人士的眼中 一直都是一个风评方差很大的岗位。 有人说策划岗又轻松又威风&#xff0c; 只需要输出想法&#xff0c;落地都交给开发&#xff0c; 干…