linux——进程间通信system V消息队列

Linux——命名管道及日志-CSDN博客


文章目录

目录

文章目录

前言

一、system V消息队列是什么?

二、相关库接口

1.shmget接口

2、ftok接口

3、shmget、ftok接口封装

4、共享内存操作 

​编辑

5、shmdt接口

三.函数的调用

1、查看共享内存

2、shell

四、连个进程进行交互

总结


前言

在之前我们手搓管道时,我们知道进程和进程之间想要通信,我们得有一块公共的内存来进行数据的交互


一、system V消息队列是什么?

  1. 定义
    • System V 消息队列是 System V IPC(Inter - Process Communication,进程间通信)机制中的一种。它提供了一种在不同进程之间传递消息的方式,这些进程可以在同一台计算机上运行。消息队列允许一个进程向消息队列发送消息,而另一个进程从这个消息队列中读取消息,从而实现进程间的异步通信。

二、相关库接口

1.shmget接口

shmget -分配一个系统V共享内存段

默认大小是4096字节也就是4kb 如果说我们想申请4097字节,但是实际上是4096*2,但是我们只能访问4097个字节

参数:

研究参数key的类型key_t;

1、key是一数字,这个数字是几,不重要,关键在于它必须在内核中具有唯一性,能够让不同的进程进行唯一性标识;

2、第一个进程可以通过key创建共享内存,第二个之后的进程,只要拿着同一个key就可以和第一个进程看到同一个共享内存!

3、对于一个已经创建好了的共享内存,key在哪?

key在共享内存的描述对象中。

4、第一次创建的时候,必须要有一个key了。

怎么有?

shmflg和我们前面讲的open一样,它的参数也是宏定义

IPC_CREAT(单独使用):如果申请的共享内存不存在就创建,如果存在就获取它shmid;

IPC_CREAT|IPC_EXCL:如果申请的共享内存不存在,就创建,存在就退出错误码,确保我们申请的共享内存是一个新的;

返回值:

2、ftok接口

获取key函数

参数

返回值key_t

这个接口是一套算法,pathname和proj_id进行数值计算

由用户约定它们的值。

3、shmget、ftok接口封装

写一段代码封装一下这两个库函数。

#include "log.hpp"
using namespace std;
const int size = 4096;
const string pathname = "/home/whb";
const int proj_id = 0x6666;
Log log;
key_t Getkey()
{key_t k = ftok(pathname.c_str(), proj_id);if (k < 0){log(Fatal, "ftok error: %s", strerror(errno));exit(1);}log(Info, "ftok success, key is : 0x%x", k);return k;
}int GetShareMemHelper(int flag)
{key_t k = Getkey();int shmid = shmget(k, size, flag);if (shmid < 0){log(Fatal, "create share memory error: %s", strerror(errno));exit(2);}log(Info, "create share memory success, shmid: %d", shmid);return shmid;
}int CreateShm()
{return GetShareMemHelper(IPC_CREAT | IPC_EXCL | 0666);
}int GetShm()
{return GetShareMemHelper(IPC_CREAT);
}

4、共享内存操作 

参数:

我们知道不管什么东西在操作系统中出现都是先描述后组织的过程;而这个shmid就相当共享内存空间的pid,他就是shmget的返回参数;

//ipc code 在这里!!

// 一旦有人把数据写入到共享内存,其实我们立马能看到了!!

// 不需要经过系统调用,直接就能看到数据了!

这个函数和c语言的malloc函数相似

返回值:

5、shmdt接口

用来断开与共享空间的连接;

 

 

三.函数的调用

#include"comm.hpp"int main()
{//Init init;//创建共享空间sleep(3);log(Debug,"先休眠3秒");int shmid=CreateShm();log(Debug,"测试创建共享空间 shmid为: %d",shmid);//让进程a与共享空间连接char* shmaddr=(char*)shmat(shmid,nullptr,0);log(Debug,"进程连接空型空间");sleep(4);log(Debug,"先休眠4秒");//断开进程a与共享空间的连接int s=shmdt(shmaddr);log(Debug,"断开与共享空间的连接 %d",s);return 0;
}

 

1、查看共享内存

ipcs -m 

共享内存的生命周期是随内核的,用户不主动关闭,共享内存就一直存在。

除非内核重启(用户释放)

2、shell
 

使用ipcs 添加参数-m可以查看系统中共享内存的详细信息

ipcs -m
使用 ipcrm 命令可以标记删除某块共享内存

# key == shmget的第一个参数
$ ipcrm -M shmkey  

# id == shmget的返回值
$ ipcrm -m shmid    

四、连个进程进行交互

我们发现当我们不输入时,进程b一直在共享空间中读取上一条数据,那么怎么改善的?

答案是结合管道

进程A

#include"comm.hpp"int main()
{Init init;//创建共享空间sleep(3);log(Debug,"进程A先休眠3秒");int shmid=CreateShm();log(Debug,"测试创建共享空间 shmid为: %d",shmid);//让进程a与共享空间连接char* shmaddr=(char*)shmat(shmid,nullptr,0);log(Debug,"进程A连接空型空间");int fd = open(FIFO_FILE, O_WRONLY); // 等待写入方打开之后,自己才会打开文件,向后执行, open 阻塞了!if (fd < 0){log(Fatal, "error string: %s, error code: %d", strerror(errno), errno);exit(FIFO_OPEN_ERR);}// 一旦有了共享内存,挂接到自己的地址空间中,你直接把他当成你的内存空间来用即可!// 不需要调用系统调用// ipc codewhile (true){cout << "Please Enter@ ";fgets(shmaddr, 4096, stdin);write(fd, "c", 1);}sleep(4);log(Debug,"A先休眠4秒");//断开进程a与共享空间的连接int s=shmdt(shmaddr);log(Debug,"A断开与共享空间的连接 %d",s);return 0;
}

进程B

#include"comm.hpp"int main()
{//Init init;//创建共享空间sleep(3);log(Debug,"进程B先休眠3秒");int shmid=GetShm();log(Debug,"测试创建共享空间 shmid为: %d",shmid);//让进程a与共享空间连接char* shmaddr=(char*)shmat(shmid,nullptr,0);log(Debug,"进程B连接空型空间");int fd = open(FIFO_FILE, O_RDONLY); // 等待写入方打开之后,自己才会打开文件,向后执行, open 阻塞了!if (fd < 0){log(Fatal, "error string: %s, error code: %d", strerror(errno), errno);exit(FIFO_OPEN_ERR);}while(true){char c;ssize_t s = read(fd, &c, 1);if(s == 0) break;else if(s < 0) break;cout << "client say@ " << shmaddr << endl; //直接访问共享内存sleep(1);}sleep(4);log(Debug,"进程B先休眠4秒");//断开进程a与共享空间的连接int s=shmdt(shmaddr);log(Debug,"进程B断开与共享空间的连接 %d",s);return 0;
}


总结

共享内存是在内存是唯一确定的,并且它们都是由操作系统先描述再组织的!

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

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

相关文章

【Redis】not support: redis

1、查看redis进程 2、查看是否安装redis扩展&#xff0c;此处以宝塔为例

网站维护记录

服务器重启&#xff0c;网站打不开&#xff1a;chown -R manager:manager /run/php-fpm/www.sock wordpress升级需设置ftp&#xff1a; // 设置权限0777 //define("FS_METHOD", "direct"); //define("FS_CHMOD_DIR", 0777); //define("…

XiYan-SQL:⼀种多⽣成器集成的Text-to-SQL框架

发布于:2024 年 12 月 03 日 星期二 北京 #NL2SQL #阿里巴巴 #Text-to-SQL 文提出了一种用于自然语言到 SQL 转换的多生成器集成框架 ——XiYan-SQL,旨在应对大型语言模型在 NL2SQL 任务中的挑战。该框架融合提示工程与监督微调(SFT)方法,利用 SFT 的可控性与上下文学习(…

283.移动零(快慢指针)

目录 题目过程解法 题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 过程 class Solution { public:void moveZeroes(vector<int…

L17.【LeetCode笔记】另一棵树的子树

目录 1.题目 代码模板 2.分析 3.代码 4.提交结果 1.题目 https://leetcode.cn/problems/subtree-of-another-tree/description/ 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff…

天天AI-241302:今日热点-B站第二届超级科学晚聚焦AIGC,年度播放量突破300亿次

2AGI.NET 天天 AI 天天AI&#xff1a;AIGC技术引领科学与媒体新浪潮天天AI&#xff1a;AIGC技术引领科学与媒体新浪潮https://www.2agi.net/blog/daily-ai-aigc-technology-leads-science-and-media-new-wave/ 1. B站第二届超级科学晚聚焦AIGC&#xff0c;年度播放量突破300亿…

MySQL数据集成到广东省追溯平台的销售信息同步方案

销售信息同步--外购上报流程2&#xff1a;MySQL数据集成到广东省特殊食品电子追溯平台 在现代数据驱动的业务环境中&#xff0c;确保销售信息的准确性和及时性至关重要。本文将分享一个具体的技术案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将MySQL中的销售信…

vue-qr在线生成二维码组件(vue2版本)

在对于二维码生成中有许多组件&#xff0c;下面介绍关于自定义比较高的vue-qr组件&#xff0c;能自定义设置背景颜色、背景图片、背景Gif图、实点和空白区的颜色、中心Logo的图片和边距。 依赖下载 注意&#xff1a; 直接npm下载最新版 有些项目可能运行会抱错 这时候你可以降…

C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

Ngrok快速将你的本地Streamlit应用创建一个公共的 URL,供外网访问

目录 1 Ngrok介绍2 Ngrok 的工作原理3 Ngrok安装4 启动Streamlit应用5 Ngrok搭建外网访问 1 Ngrok介绍 Ngrok 是一个开源工具和商业服务&#xff0c;可以为你的本地应用创建一个安全的公共 URL&#xff0c;使其能够通过互联网访问&#xff0c;而无需复杂的网络配置&#xff08…

青龙面板的定时规则

6个数字的定时规则&#xff0c; 第1个是秒&#xff0c;第2个是分&#xff0c;第3个是时&#xff0c;第4个是每月的哪日&#xff0c;第5个是哪月&#xff0c;第6个是每周的周几。 数字之间空格隔开。 不限制的用*号替代&#xff0c;定期的时间用“?”替代&#xff0c;间隔运…

XSS(DOM)-HIGH错误总结

HIGH就不从简单的开始。 我们直接闭合HTML标签绕过 ></option></select><img srcx:alert(alt) οnerrοreval(src) altxss> 没有变化 这里应该是后端的问题&#xff0c;试试锚点注入 English#<script>alert(xss)</script> 这里不知道什么…

深度学习图像增强介绍

目录 一、引言二、常用数据增广方法三、图像变换类3.1 AutoAugment3.2 RandAugment 四、图像裁剪类4.1 Cutout4.2 RandomErasing4.3 HideAndSeek 五、图像混叠5.1 Mixup5.2 Cutmix 六、结论 一、引言 在图像分类任务中&#xff0c;图像数据的增广是一种常用的正则化方法&#…

MySQL导入.sql文件后数据库乱码问题

问题分析&#xff1a; 当导入.sql文件后&#xff0c;发现数据库中的备注出现乱码&#xff0c;通常是由于一下原因导致&#xff1a; 字符集不匹配&#xff1a;.sql文件、MySQL服务器、客户端连接使用的字符集不一致。备注内容编码问题&#xff1a;备注内容本身的编码格式与数据…

云数据库 RDS

云数据库 RDS&#xff08;Relational Database Service&#xff0c;关系型数据库服务&#xff09;是由阿里云提供的一种托管的关系型数据库服务&#xff0c;旨在简化数据库的部署、管理和维护工作&#xff0c;帮助用户快速构建、部署和管理关系型数据库。RDS 提供了包括 MySQL、…

图社区发现算法-Louvain算法

Louvain社区发现算法出自2008年的论文《Fast unfolding of communities in large networks》&#xff0c;其名字是根据作者所在的城市来命名的。它基于模块度优化来实现社区划分。 准备知识 模块度(modularity)是用来衡量社区内部的链接密度相比社区之间的链接密度的介于-1和…

Elasticsearch之索引的增删改查(6.x版本)-yellowcong

1. 节点信息查看 #查看集群健康情况 curl -X GET localhost:9200/_cat/health?v&pretty#查看节点信息 curl -X GET localhost:9200/_cat/nodes?v&pretty 2. 索引管理 在es中&#xff0c;索引就相当于是mysql中的库了。 #查看索引列表 curl -X GET localhost:9200/…

技术栈4:Docker入门 Linux入门指令

目录 1.Linux系统目录结构 2.处理目录的常用命令 3.Docker概述 4.Docker历史 5.Docker基本组成 6.Docker底层原理 7.Docker修改镜像源 8.Docker基本命令 在学习docker之前我们先要熟悉Linux系统&#xff0c;推荐阅读&#xff1a;Linux笔记&#xff08;狂神说&#xff0…

UFS文档导航

目录 1、UFS系统模型 2、UFS子系统实现架构 3、Host Controller 4、M-PHY 5、UFS Device 1、UFS系统模型 2、UFS子系统实现架构 3、Host Controller 模块 文档名称 文档描述 Host Controller JESD223D 协议文档&#xff0c;UFS Host Controller Interface DWC_ufshc…

北斗系统:构建天地一体化的高精度定位服务

随着北斗卫星导航系统的全面建成&#xff0c;中国在全球卫星导航领域迈出了坚实的一步。北斗系统不仅提供了全天候、全天时的全球覆盖服务能力&#xff0c;更通过天地一体化的高精度增强服务系统技术&#xff0c;将民用定位精度提升到了新的高度。 北斗系统的高精度服务 北斗…