进程间的通信4 共享内存

共享内存

1.共享内存简介

  • 共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中,减少数据在内核空间缓存
  • 共享内存是一种效率较高的进程间通讯的方式
  • 在 Linux 系统中通过 ipcs -m 查看所有的共享内存
    在这里插入图片描述
  • 共享内存模型图
    在这里插入图片描述

2.共享内存的创建

1.函数头文件
#include<sys/ipc.h>
#include<sys/shm.h>
2.函数原型
intshmget(key_tkey,size_tsize,intshmflg);
3.函数功能
创建一个共享内存,并返回ID
4/函数参数key:ftok()函数返回size:共享内存的大小shmflg:共享内存标志
5.函数返回值
成功:返回共享内存id
失败:返回-1,并设置errno

3.共享内存的删除

1.函数头文件
#include<sys/ipc.h>
#include<sys/shm.h>
2.函数原型
int shmctl(int shmid,int cmd,struct shmid_ds*buf);
3.函数功能
共享内存控制函数,功能由具体的功能命令字决定
4.函数参数shmid:共享内存id cmd:控制命令字IPC_STAT:获取消息队列属性IPC_SET:设置消息队列属性I	PC_RMID:删除消息队列属性,用此命名时,第三个参数为NULL buf:共享内存属性结构体指针
5.函数返回值
成功:返回0,特殊命令字除外
失败:返回-1

4.共享内存映射

1.函数头文件
#include<sys/types.h>
#include<sys/shm.h>
2.函数原型
void*shmat(int shmid,const void*shmaddr,int shmflg);
3.函数功能
将进程地址空间映射到共享内存上
4.函数参数
shmid:共享内存id
shmaddr:指定映射到进程地址空间的起始地址,指定为NULL,由系统选择映射的地址shmflg:共享内存标志,一般设置为0
5.函数返回值
成功:返回映射到进程地址空间的起始地址
失败:(void*)-1,并设置errno

5.共享内存解除映射

1.函数头文件
#include<sys/types.h>
#include<sys/shm.h>
2.函数原型
intshmdt(constvoid*shmaddr);
3.函数功能
解除进程地址空间与共享内存的映射
4.函数参数
shmaddr:映射地址空间的起始地址
5.函数返回值
成功:返回0
失败:返回-1,并设置errno

6.测试案列(在文件输出内容):

share_write.c:

#include <sys/types.h>
#include <sys/ipc.h>
#include <string.h> 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/shm.h>
#define PATH "/home/linuxfu"
#define SIZE 1024
int main(){key_t key = ftok(PATH,70);if(key == -1){perror("key");exit(EXIT_FAILURE);}//设置共享内存 int shmid = shmget(key,SIZE,0666 | IPC_CREAT);if(shmid == -1){perror("shmid");exit(EXIT_FAILURE);} //挂接共享内粗void * share_add = shmat(shmid,NULL,0);if(share_add == (void*)-1){perror("share_add");exit(EXIT_FAILURE);}char buf[SIZE] = { 0 };fgets(buf,sizeof(buf) - 1,stdin);buf[strlen(buf) - 1]  = '\0'; strcpy((char*)share_add,buf); //挂断shmdt(share_add); 
}

share_read.c:

#include <sys/types.h>
#include <sys/ipc.h>
#include <string.h> 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/shm.h>
#define PATH "/home/linuxfu"
#define FILENAME "log.txt"
#define SIZE 1024
int main(){key_t key = ftok(PATH,70);if(key == -1){perror("key");exit(EXIT_FAILURE);}//设置共享内存 int shmid = shmget(key,SIZE,0666 | IPC_CREAT);if(shmid == -1){perror("shmid");exit(EXIT_FAILURE);} //挂接共享内粗void * share_add = shmat(shmid,NULL,0);if(share_add == (void*)-1){perror("share_add");exit(EXIT_FAILURE);}FILE * pf = fopen(FILENAME,"w+");if(pf == NULL){perror("pf");exit(EXIT_FAILURE);}	fputs((char*)share_add,pf);shmdt(share_add); shmctl(shmid,IPC_RMID,NULL);
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java算法专栏

专栏导读 在当今这个技术日新月异的时代&#xff0c;Java算法作为软件开发的核心&#xff0c;对于提升程序性能和解决复杂问题至关重要。本“Java算法”专栏旨在帮助读者深入理解Java编程语言中的算法原理和应用&#xff0c;通过实战案例和深入分析&#xff0c;使读者能够掌握…

Java汽车销售管理

技术架构&#xff1a; springboot mybatis Mysql5.7 vue2 npm node 功能描述&#xff1a; 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&#xff0c;提供经理和销售两种角色进行管理 效果图&#xff1a;

Python基础学习(3)

目录 一&#xff0c;函数 1&#xff0c;函数的定义 2&#xff0c;函数的参数 1&#xff0c;默认值 2&#xff0c;传参 3&#xff0c;返回值 4&#xff0c;变量的作用域 5&#xff0c;函数的调用 二&#xff0c;常用数据结构 1&#xff0c;列表 列表的定义 列表的特性…

【Geoserver使用】REST API调用(工作空间部分)

文章目录 前言一、Geoserver REST API(GeoServer Workspace)二、GeoServer Workspace接口使用1.GET请求 /workspaces2.POST请求 /workspaces3.GET请求 /workspaces/{workspaceName}4.PUT /workspaces/{workspaceName}5.DELETE /workspaces/{workspaceName} 总结 前言 根据Geos…

C++ | Leetcode C++题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; class Solution { public:string originalDigits(string s) {unordered_map<char, int> c;for (char ch: s) {c[ch];}vector<int> cnt(10);cnt[0] c[z];cnt[2] c[w];cnt[4] c[u];cnt[6] c[x];cnt[8] c[g];cnt[3] c[h] - …

YOLOv10 简介

YOLOv10&#xff0c;由清华大学的研究人员基于 Ultralytics Python 包构建&#xff0c;引入了一种全新的实时目标检测方法&#xff0c;该方法解决了以往 YOLO 版本中后处理和模型架构方面的不足。通过消除非极大值抑制&#xff08;NMS&#xff09;并优化各种模型组件&#xff0…

【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标

chrome 谷歌浏览器&#xff0c;鼠标点击任何区域都是 Input 输入框的状态&#xff0c;能看到输入的光标 今天打开电脑的时候&#xff0c;网页中任何文本的地方&#xff0c;只要鼠标点击&#xff0c;就会出现一个输入的光标&#xff0c;无论在哪个站点哪个页面都是如此。 我知道…

十四、运算放大电路

运算放大电路 1、理想运算放大器的概念。运放的输入端虚拟短路、虚拟断路之间的区别; 2、反相输入方式的运放电路的主要用途&#xff0c;以及输入电压与输出电压信号的相位 3、同相输入方式下的增益表达式(输入阻抗、输出阻抗)

Redis-01 入门和十大数据类型

Redis支持两种持久化方式&#xff1a;RDB持久化和AOF持久化。 1.RDB持久化是将Redis的数据以快照的形式保存在磁盘上&#xff0c;可以手动触发或通过配置文件设置定时触发。RDB保存的是Redis在某个时间点上的数据快照&#xff0c;可以通过恢复RDB文件来恢复数据。 2.AOF持久化…

55. QTableWidget的基本使用

1. 说明 在软件界面开发中,基本上离不开数据的展示以供客户查看一些比较关注的信息,比如公司做一个员工个人信息管理系统,需要一个界面能够展示员工个人基本信息,实现这种效果可以采用多种形式,其中比较简单的一种是使用QT提供的QTableWidget控件,这个控件已经封装了一些…

LeetCode 面试经典150题 190.颠倒二进制位

复习知识&#xff1a;正数的原码、反码、补码相同&#xff0c;负数的反码在其原码的基础上, 符号位不变&#xff0c;其余各个位取反&#xff0c;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后1 (即在反码的基础上1)。 题目&#xff1a;颠倒给定的 32 位无符号…

Springboot3 + MyBatis-Plus + MySql + Uniapp 商品加入购物车功能实现(最新教程附源码)

Springboot3 MyBatis-Plus MySql Uniapp 商品加入购物车功能实现&#xff08;针对上一篇sku&#xff09; 1、效果展示2、后端代码2.1 model2.2 mapper server serverImpl 参照上一篇自动生成2.3 controller 3、前端代码3.1 index.js3.2 shop-info.vue3.3 ShopBottomButton.v…

计算机毕业设计hadoop+spark+hive新能源汽车销售数据分析系统 二手车销量分析 新能源汽车推荐系统 可视化大屏 汽车爬虫 机器学习

《HadoopSparkHive新能源汽车销售数据分析系统》开题报告 一、选题背景与意义 1.1 选题背景 随着全球对环境保护意识的增强和能源结构的转型&#xff0c;新能源汽车市场迅速崛起。新能源汽车的销售数据不仅反映了市场趋势和消费者偏好&#xff0c;还为企业决策、政府监管和政…

【玉米田】

题目 代码 #include <bits/stdc.h> using namespace std; typedef long long LL;const int mod 1e8; const int M 1 << 12; LL f[13][M]; int g[13]; vector<int> state; vector<int> p[M]; int n, m; bool check(int x) {return !(x & x <&…

“一屏显江山”,激光显示重构「屏中世界」

【潮汐商业评论/原创】 2024年国庆期间&#xff0c;曾感动过无数国人的舞蹈诗剧《只此青绿》改编的同名电影即将上映&#xff0c;而这一次观众们不必走进电影院&#xff0c;在家里打开官方合作的海信激光电视也能享受到同等的视听效果&#xff0c;这是激光电视在观影场景领域的…

java 获取集合a比集合b多出来的对象元素

public class OrderListEntity {/*** deprecated 对象集合的处理* param aData 集合a* param bData 集合b* return 返回集合a比集合b多出来的部分, 通过id判断*/public static List<OrderListEntity> AHasMoreThanBData(List<OrderListEntity> aData, List<Ord…

Stable Diffusion 使用详解(11)--- 场景ICON制作

目录 背景 controlNet 整体描述 Canny Lineart Depth 实际使用 AI绘制需求 绘制过程 PS打底 场景模型选择 设置提示词及绘制参数 controlnet 设置 canny 边缘 depth 深度 lineart 线稿 效果 背景 这段时间不知道为啥小伙伴似乎喜欢制作很符合自己场景的ICON。…

鸿蒙开发(HarmonyOS)组件化浅谈

众所周知&#xff0c;现在组件化在移动开发中是很常见的&#xff0c;那么组件化有哪些好处&#xff1a; 1. 提高代码复用性&#xff1a;组件化允许将应用程序的不同功能模块化&#xff0c;使得这些模块可以在不同的项目中重复使用&#xff0c;从而提高开发效率并减少重复工作。…

LabVIEW编程能力如何能突飞猛进

要想让LabVIEW编程能力实现突飞猛进&#xff0c;需要采取系统化的学习方法&#xff0c;并结合实际项目进行不断的实践。以下是一些提高LabVIEW编程能力的关键策略&#xff1a; 1. 扎实掌握基础 LabVIEW的编程本质与其他编程语言不同&#xff0c;它是基于图形化的编程方式&…

行业人工智能研究-Python自监督方式学习图像表示算法

学术界人工智能研究落后于工业界 摘要 行业或工业界在人工智能研究上超出学术界&#xff0c;并占据着大量的计算力&#xff0c;数据集和人才诱人的薪水和明朗的预期吸引大量人才离开学术界&#xff0c;涌入行业或工业界即使&#xff0c;比如Meta开源其人工智能模型&#xff0…