Linux-System V共享内存

目录

  • System V共享内存
    • 共享内存概述
    • 创建或打开共享内存
    • 使用共享内存
    • 分离共享内存
    • 控制共享内存
      • 1、IPC_STAT
      • 2、IPC_SET
    • 代码示例

System V共享内存

共享内存概述

共享内存是所有IPC中最快的一种。它之所以快是因为共享内存一旦映射到进程的地址空间,进程之间数据的传递就不需要涉及内核了。

管道、FIFO和消息队列,任意两个进程之间想要交换信息,都必须通过内核,内核在其中发挥了中转站的作用:

  • 发送信息的一方,通过系统调用(write或msgsnd)将信息从用户层拷贝到内核层,由内核暂存这部分信息。
  • 提取信息的一方,通过系统调用(read或msgrcv)将信息从内核层提取到应用层。

建立共享内存之后,内核完全不参与进程间的通信,这种说法严格来讲并不是正确的。因为当进程使用共享内存时,可能会发生缺页,引发缺页中断,这种情况下,内核还是会参与进来的。

允许多个进程同时操作共享内存,就不得不防范竞争条件的出现,比如有两个进程同时执行更新操作,或者一个进程在执行读取操作时,另外一个进程正在执行更新操作。因此,共享内存这种进程间通信的手段通常不会单独出现,总是和信号量、文件锁等同步的手段配合使用。

创建或打开共享内存

shmget函数负责创建或打开共享内存段,其接口定义如下:

#include <sys/ipc.h>
#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);

第一个参数是共享内存标识,可以随机选择一个整数值,也可以使用ftok函数创建。

可以参考链接:https://blog.csdn.net/m0_51415606/article/details/138001330?spm=1001.2014.3001.5502

第二个参数size必须是正整数,表示要创建的共享内存的大小。内核以页面大小的整数倍来分配共享内存,因此,实际size会被向上取整为页面大小的整数倍。

第三个参数支持IPC_CREAT和IPC_EXCL标志位。如果没有设置IPC_CREAT标志位,那么第二个参数size对共享内存段并无实际意义,但是必须小于或等于共享内存的大小,否则会有EINVAL错误。

返回值:

创建或打开的共享内存标识。

使用共享内存

shmget函数,不过是在茫茫内存中创建了或找到了一块共享内存区域,但是这块内存和进程尚没有任何关系。要想使用该共享内存,必须先把共享内存引入进程的地址空间,这就是attach操作。

attach操作的接口定义如下:

#include <sys/types.h>
#include <sys/shm.h>void *shmat(int shmid, const void *shmaddr, int shmflg);

第一个参数是调用shmget函数的返回值。

第二个参数是用来指定将共享内存放到虚拟地址空间的什么位置的。大部分的普通青年都会将第二个参数设置为NULL,表示用户并不在意,一切交由内核做主。

第三个参数是标志参数,用于指定连接共享内存的选项。

  • 如果指定了 SHM_RDONLY 标志,则进程只能以只读方式访问共享内存,否则进程可以以读写方式访问共享内存。
  • 通常可以使用 0 作为该参数,表示默认行为。

返回值:

调用成功,则返回进程虚拟地址空间内的一个地址。如果失败,就会返回(void*)-1,并且设置errno。

分离共享内存

分离操作的接口定义如下:

#include <sys/types.h>
#include <sys/shm.h>int shmdt(const void *shmaddr);

shmdt函数仅仅是使进程和共享内存脱离关系,并未删除共享内存。shmdt函数的作用是将共享内存的引用计数减1。如前所述,只有共享内存的引用计数为0时,调用shmctl函数的IPC_RMID命令才会真正地删除共享内存。

进程执行exec之后,所有attach的共享内存都会被分离。当进程终止之后,共享内存也会自动被分离。

控制共享内存

shmctl函数用来控制共享内存,函数接口定义如下:

#include <sys/ipc.h>
#include <sys/shm.h>int shmctl(int shmid, int cmd, struct shmid_ds *buf);

当cmd为IPC_STAT和IPC_SET时,需要用到第三个参数。其中shmid_ds结构体的定义如下:

struct shmid_ds {struct ipc_perm shm_perm;size_t          shm_segsz;time_t          shm_atime;time_t          shm_dtime;time_t          shm_ctime;pid_t           shm_cpid;pid_t           shm_lpid;shmatt_t       shm_nattch;...
};

1、IPC_STAT

用于获取shmid对应的共享内存的信息。所谓信息,就是上面结构体的内容。

2、IPC_SET

IPC_SET也只能修改shm_perm中的uid、gid及mode。

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>#define SHM_SIZE 1024int main() {int shmid;key_t key;char* shmaddr;// 生成一个唯一的keykey = ftok(".", 's');if (key == -1) {perror("ftok");exit(1);}// 创建共享内存段shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);if (shmid == -1){perror("shmget");exit(1);}// 将共享内存段映射到进程的地址空间shmaddr = (char*)shmat(shmid, NULL, 0);if (shmaddr == (char*)-1){perror("shmat");exit(1);}// 创建五个子进程for (int i = 0; i < 5; ++i){pid_t pid = fork();if (pid < 0){perror("fork");exit(1);}else if (pid == 0) {  // 子进程while (1){printf("Child %d: PID=%d\n", i + 1, getpid());char message[50];sprintf(message, "Message from Child %d", i + 1);sprintf(shmaddr, "%s", message);// exit(0);sleep(1);}}}while (1){// 打印从共享内存中读取的消息printf("Parent process reads: %s\n", shmaddr);sleep(1);}// 等待所有子进程退出for (int i = 0; i < 5; ++i)wait(NULL);// 分离共享内存if (shmdt(shmaddr) == -1){perror("shmdt");exit(1);}// 删除共享内存段if (shmctl(shmid, IPC_RMID, NULL) == -1){perror("shmctl");exit(1);}return 0;
}

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

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

相关文章

创建型设计模式

七大原则 1. 开闭原则&#xff08;Open-Closed Principle, OCP&#xff09; 详解&#xff1a;软件实体&#xff08;类、模块、函数等&#xff09;应该易于扩展&#xff0c;但是不易于修改。换句话说&#xff0c;当软件需求变化时&#xff0c;应该通过添加新代码来实现变化&am…

CSP初赛知识精讲--排列组合

第十一节 排列组合 基础知识 排列是指从给定个数的元素中取出指定个数的元素进行排序。  组合是指从给定个数的元素中仅仅取出指定元素个数的元素&#xff0c;不考虑排序。  排列组合问题的关键就是研究给定要求的排列和组合可能出现的情况的总数。 定义与公式  排列&…

销冠必备:高效跟进客户的四个技巧

作为一名销售&#xff0c;高效而精准地跟进客户是取得成功的关键。今天&#xff0c;我将分享四个技巧&#xff0c;让你也能够高效的跟进客户。 1、善于发问 通过多询问客户&#xff0c;你可以更好地了解客户的需求和痛点。在与客户交流时&#xff0c;不要只是简单地回答问题&…

LeetCode 0216.组合总和 III:回溯(剪枝) OR 二进制枚举

【LetMeFly】216.组合总和 III&#xff1a;回溯(剪枝) OR 二进制枚举 力扣题目链接&#xff1a;https://leetcode.cn/problems/combination-sum-iii/ 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返…

业务复习知识点Oracle查询

业务数据查询-1 单表查询 数据准备 自来水收费系统建表语句.sql 简单条件查询 精确查询 需求 &#xff1a;查询水表编号为 30408 的业主记录 查询语句 &#xff1a; select * from t_owners where watermeter 30408; 查询结果 &#xff1a; 模糊查询 需求 &#xff1a;查询业…

毕业设计注意事项(2024届更新中)

1.开题 根据学院发的开题报告模板完成&#xff0c;其中大纲部分可参考资料 2.毕设 根据资料中的毕设评价标准&#xff0c;对照工作量 3.论文 3.1 格式问题 非常重要&#xff0c;认真对比资料中我发的模板&#xff0c;格式有问题&#xff0c;答辩输一半&#xff01; 以word…

W801学习笔记十四:掌机系统——菜单——尝试打造自己的UI

未来将会有诸多应用&#xff0c;这些应用将通过菜单进行有序组织和管理。因此&#xff0c;我们需要率先打造好菜单。 LCD 驱动通常是直接写屏的&#xff0c;虽然速度较快&#xff0c;但用于界面制作则不太适宜。所以&#xff0c;最好能拥有一套 UI 框架。如前所述&#xff0c;…

【linux】编译器使用

目录 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&#xff09; 2. .o 文件和库的链接方式 a. 链接方式 b. 动态库 和 静态库 优缺点对比 c. debug 版本 和 release 版本 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&…

设计模式-创建型-抽象工厂模式-Abstract Factory

UML类图 工厂接口类 public interface ProductFactory {Phone phoneProduct();//生产手机Router routerProduct();//生产路由器 } 小米工厂实现类 public class XiaomiFactoryImpl implements ProductFactory {Overridepublic Phone phoneProduct() {return new XiaomiPhone…

Node.js -- fs模块

文章目录 1. 写入文件1.1 写入文件1.2 同步和异步1.3 文件追加写入1.4 流式写入1.5 文件写入的场景 2. 读取文件2.1 异步和同步读取2.2 读取文件应用场景2.3 流式读取2.4 fs 练习 -- 文件复制 3. 文件重命名和移动4. 文件删除5. 文件夹操作5.1 创建文件夹5.2 读取文件夹5.3 删除…

crossover和wine哪个好 wine和crossover有什么本质区别 苹果电脑运行Windows crossover24

CrossOver是Wine的延伸产品&#xff0c;CrossOver可以简单的理解为类虚拟机&#xff0c;那么wine是什么&#xff0c;许多小伙伴就可能有些一知半解。CrossOver和wine哪个好&#xff0c;wine和CrossOver有什么本质区别呢&#xff1f;下文将围绕着这两个问题展开。 一、CrossOve…

tcp inflight 守恒算法的几何解释

接上文&#xff1a;tcp inflight 守恒算法背后的哲学 在 tcp inflight 守恒算法正确性 中&#xff0c;E bw / srtt 的公平最优解是算出来的&#xff0c;如果自然可以用数学描述&#xff0c;那能算出来的东西反过来也一定能通过直感看出来&#xff0c;我倾向于用几何和力学描述…

力扣HOT100 - 199. 二叉树的右视图

解题思路&#xff1a; 相当于层序遍历&#xff0c;然后取每一层的最后一个节点。 class Solution {public List<Integer> rightSideView(TreeNode root) {if (root null) return new ArrayList<Integer>();Queue<TreeNode> queue new LinkedList<>…

Pushmall智能AI数字名片— —寻求商机合作的营销推广平台

Pushmall智能AI数字名片— —寻求商机合作的营销推广平台 开发计划 2024年2月开发计划&#xff1a; 1、优化名片注册、信息完善业务流程&#xff1b; 2、重构商机信息&#xff1a;供应信息、需求信息发布。 3、会员名片服务优化 4、企业名片&#xff1a;员工管理优化 5、CRM客…

【计算机网络】网络模型

OSI七层网络模型 七层模型如图所示 每层的概念和功能 物理层 职责&#xff1a;将数据以比特为单位&#xff0c;通过不同的传输介质将数据传输出去。 主要协议&#xff1a;物理媒介相关的协议&#xff0c;如RS232&#xff0c;V.35&#xff0c;以太网等。 数据链路层 职责&…

Spring AI

Spring AI 文章目录 Spring AI关于 Spring AI使用Spring CLISpring Initializr添加 Milestone 和 Snapshot Repositories依赖管理为特定组件添加依赖项Embeddings ModelsChat ModelsImage Generation ModelsVector Databases 示例工程 关于 Spring AI github : https://github…

mapbox中filter表达式

起初让我研究的原因使一个报错&#xff1a; layers.TRSA.filter[2][1][2]: string, number, or boolean expected, array found 我很确定筛选条件没问题&#xff0c;那么为何报错呢&#xff1f;百度&#xff0c;找到原因&#xff1a; https://docs.mapbox.com/style-spec/refe…

【WSL报错】执行:wsl --list --online;错误:0x80072ee7

【WSL报错】执行:wsl --list --online&#xff1b;错误:0x80072ee7 问题情况解决方法详细过程 问题情况 C:\Users\17569>wsl --list --online 错误: 0x80072ee7 解决方法 开系统代理&#xff0c;到外网即可修复&#xff01;&#xff01;&#xff01;&#xff01;&#x…

电商市场已饱和,各大平台都在卷价格?那是你不了解视频号小店

大家好&#xff0c;我是电商笨笨熊 现在做电商除了疯狂内卷就是疯狂内卷&#xff1b; 各大平台都是内卷价格&#xff0c;嘴上说着不想成为拼多多一样的平台&#xff0c;实际做的却是低价再低价&#xff0c;都希望能通过低价吸引用户提高转化&#xff1b; 因此现在很多玩家对…

windows驱动系列-概述

之前一直长期做windows驱动开发&#xff0c;但是一直将这些技术知识点进行整理和总结&#xff0c;最近又开始做一套新的驱动&#xff0c;于是就打算趁这个机会&#xff0c;将一些windows驱动开发的技术知识系统性的整理出来。 目录如下: windows驱动开发知识-设计目标 windo…