5、操作系统——进程间通信(3)(system V-IPC:消息队列)
目录
1、管道的缺点
2、消息队列
3、消息队列的API
(1)获取消息队列的ID(类似文件的描述符)(msgget)
(2)发送、接收消息(msgrcv)
(3)获取和设置消息队列的属性(msgctl)
4、消息队列的使用方法
(1)发送者
(2)接收者
1、管道的缺点
(1)无法读取一个“指定”的数据,因为数据没有标记,故只能按次序挨个读取
(2)多对进程之间的相互通信,要用多对管道分别处理
2、消息队列
(1)有数据标识的特殊管道,每一段被写入的数据都变成带标识的消息。
(2)读取消息的进程只要指定标识就可以正确读取,而不会受到其他消息干扰
(3)从运行效果看,一个带标识的消息队列,就像多条并存的管道
3、消息队列的API
(1)获取消息队列的ID(类似文件的描述符)(msgget)

(2)发送、接收消息(msgrcv)

a、发送消息时,消息必须被组织成以下形式
struct msgbuf
{long mtype; // 消息的标识char mtext[1]; // 消息的正文 可以是任何类型数据
};
发送出去的消息必须以一个 long 型数据打头,作为该消息的标识,后面的数据则没有要求。
b、消息的标识可以是任意长整型数值,但不能是 0L。
c、参数 msgsz 是消息中正文的大小,不包含消息的标识。
(3)获取和设置消息队列的属性(msgctl)

4、消息队列的使用方法
(1)发送者
A) 获取消息队列的 ID
B) 将数据放入一个附带有标识的特殊的结构体,发送给消息队列。
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <sys/msg.h>struct msgbuf
{long mtype; // 【重点】消息的标识int num ; // 消息的正文 可以是任何类型数据
};int main(int argc, char const *argv[])
{// 获得KEY值key_t key = ftok("./", 1 );printf("key:%d\n" , key );// 获得消息队列的ID int ID = msgget( key , IPC_CREAT | 0644 );printf("消息队列ID 为:%d \n " , ID );// 配置消息struct msgbuf msg = {.mtype = 'X', // 设置消息数据的类型(标识).num = 1024 // 实际发送的信息};// 发送消息msgsnd(ID , &msg , sizeof(msg.num), MSG_NOERROR);// 标记删除msgctl(ID , IPC_RMID , NULL );return 0;
}
(2)接收者
A) 获取消息队列的 ID
B) 将指定标识的消息读出。
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <sys/msg.h>struct msgbuf
{long mtype; // 【重点】消息的标识int num ; // 消息的正文 可以是任何类型数据
};int main(int argc, char const *argv[])
{// 获得KEY值key_t key = ftok("./", 1 );printf("key:%d\n" , key );// 获得消息队列的ID int ID = msgget( key , IPC_CREAT | 0644 );printf("消息队列ID 为:%d \n " , ID );// 配置消息struct msgbuf msg = {0};// 接收消息// int msg ; int ret_val = msgrcv( ID , &msg, sizeof(msg.num), 'X', MSG_NOERROR );printf("ret:%d msg:%d\n" , ret_val, msg.num );// 标记删除msgctl(ID , IPC_RMID , NULL );return 0;
}
相关文章:
5、操作系统——进程间通信(3)(system V-IPC:消息队列)
目录 1、管道的缺点 2、消息队列 3、消息队列的API (1)获取消息队列的ID(类似文件的描述符)(msgget) (2)发送、接收消息(msgrcv) (3)获取和设置消息队列的属性(msgctl) 4、消息队…...
C++vector容器用法详解
一、前言vector 是封装动态数组的顺序容器,连续存储数据,所以我们不仅可以通过迭代器访问存储在 vector 容器中的数据,还能用指向 vector 容器中的数据的常规指针访问数据。这意味着指向 vector 容器中的数据的指针能传递给任何期待指向数组元…...
Log4j2的Loggers详解
引言 官方配置文档:https://logging.apache.org/log4j/2.x/manual/filters.html Loggers节点 Loggers节点常见的有两种:Root和Logger <Loggers><Logger name"org.apache.logging.log4j.core.appender.db" level"debug" additivity&qu…...
计算机视觉的应用1-OCR分栏识别:两栏识别三栏识别都可以,本地部署完美拼接
大家好,我是微学AI,今天给大家带来OCR的分栏识别。 一、文本分栏的问题 在OCR识别过程中,遇到文字是两个分栏的情况确实是一个比较常见的问题。通常情况下,OCR引擎会将文本按照从左到右,从上到下的顺序一行一行地识别…...
低代码平台如何选型, 43款国内外低代码平台一网打尽
目前,零代码技术和低代码技术越来越成熟,低代码平台也越来越被大家所接受,国内低代码平台厂商和产品层出不穷,到底哪家低代码平台好,企业如何选型,以下给出一些参考。 一、低代码平台如何选型 企业如何选…...
第六周作业(1.5小时)
一、PreparedStatement PreparedStatement也可以用来执行sql语句,但是需要注意:它需要用sql创建好PreparedStatement,而Statement不需要用sql来创建。 优点: 1、具有较好的可维护性和可读性,参数的分别插入减少了错…...
排序 (蓝桥杯) JAVA
目录题目描述:冒泡排序算法(排序数字,字符):String与String buffer的区别:纯暴力破解(T到爆炸):暴力破解加思考(bingo):总结:题目描述: 小蓝最近学习了一些排序算法,其中冒泡排序让他…...
【Blender 水墨材质】实现过程剖析01
写在前面 想把Blender一位大佬演示的Blender水墨材质过程,在Unity用Shader重现,过程中会拿能拿到的节点代码举例(ShaderGraph或者UE的都会有)。第一步当然是要跟着人家做一遍!我会尽可能地分析一下每一步的原理~ 教程…...
代码随想录算法训练营第五十六天|583. 两个字符串的删除操作、72. 编辑距离
LeetCode 583 两个字符串的删除操作 题目链接:https://leetcode.cn/problems/delete-operation-for-two-strings/ 思路: 方法一:两个子串同时删除元素 dp数组的含义 dp[i][j]dp[i][j]dp[i][j]代表以i-1为结尾的字符串word1,和以j-1位结…...
【ArchLinux】【KDE】Archlinux的安装与使用
文章目录开头前言所需环境演示环境相关链接安装教程在Windows环境下制作启动盘进入ArchLinux Live环境安装为硬盘分区如何新建分区?分区表格式化分区分区完成,开始安装挂载分区切换镜像源安装基本系统设置将Live环境(当前)挂载信息…...
Go语言精修(尚硅谷笔记)第六章
六、函数、包和错误处理 6.1 函数概念 不用函数的弊端 1)写法可以完成功能, 但是代码冗余 2 ) 同时不利于代码维护 概念:为完成某一功能的程序指令(语句)的集合,称为函数。 在Go中,函数分为: 自定义函数、系统函数 基本语法 //函数的基本语法 fu…...
Photoshop的功能
Photoshop是一款功能强大的图片编辑软件,它提供了数百种不同的工具和特效,让您可以编辑图片、创建图形和设计网页等。 以下是Photoshop的一些主要功能: 1.图层:Photoshop允许您创建多个图层,让您可以在每一个图层上进…...
C++初阶——内存管理
目录 1. C/C内存分布 2. C语言中动态内存管理方式:malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4. operator new与operator delete函数 重要 4.1 operator new与operator delete函数(…...
uds服务汇总
还有一些服务列举在下面: RequestDownload(服务ID为0x34)和RequestUpload(服务ID为0x35):这两个服务用于在ECU和诊断器之间进行数据传输。通过 RequestDownload服务,诊断器可以请求ECU接收一些数…...
【深度学习】2023李宏毅homework1作业一代码详解
研一刚入门深度学习的小白一枚,想记录自己学习代码的经过,理解每行代码的意思,这样整理方便日后复习也方便理清自己的思路。感觉每天时间都不够用了!!加油啦。 第一部分:导入模块 导入各个模块࿰…...
【软件测试】基础知识第二篇
文章目录一. 开发模型1. 瀑布模型2. 螺旋模型3. 增量和迭代模型3.1 增量模型3.2 迭代模型3.3 增量和迭代模型的区别4. 敏捷模型4.1 敏捷宣言4.2 scrum模型二. 开发模型V 模型W 模型一. 开发模型 1. 瀑布模型 瀑布模型在软件工程中占有重要地位,是所有其他模型的基…...
Java中File类以及初步认识流
1、File类操作文件或目录属性 (1)在Java程序中通过使用java.io包提供的一些接口和类,对计算机中的文件进行基本的操作,包括对文件和目录属性的操作、对文件读写的操作; (2)File对象既可以表示…...
【C语言】文件操作详细讲解
本章要分享的内容是C语言中文件操作的内容,为了方便大家学习,目录如下 目录 1.为什么要使用文件 2.什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3.文件的打开和关闭 3.1文件指针 3.2打开和关闭 4.文件的顺序读写 4.1顺序读写函数介绍…...
爱奇艺万能联播使用教程
众所周知,爱奇艺是百度旗下的一款产品,所以今天用爱奇艺万能联播的方法实现下载百度网盘,并没有破解百度网盘,是官方正版下载渠道。软件是官方版本,大家双击安装即可。 安装完成以后,在软件中就有了“访问网…...
真题讲解-软件设计(三十七)
数据流图DFD(真题讲解)-软件设计(三十六)https://blog.csdn.net/ke1ying/article/details/129803164 在网络安全管理中,加强内防内控可采取的策略是? 终端访问权限,防止合法终端越权访问。加强…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
