SystemV 共享内存(一)—— 共享内存的创建与释放(shmget / shmctl)

本文详细介绍了SystemV IPC中的共享内存,包括其定义、特点、生命周期,以及如何通过shmget和shmctl函数进行创建、连接、控制和释放。共享内存是一种高效进程间通信方式,其ID用于标识和访问。文章通过实例展示了共享内存的使用,并讨论了其不同于匿名管道的持久性。

匿名管道和命名管道都是基于文件的进程间通信,SystemV方案是在OS内核层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口

SystemV方案包含三种:共享内存、消息队列、信号量

下面要说的就是共享内存的创建和释放


目录

一、什么是共享内存??

1、共享内存的定义

2、共享内存的特点

二、使用共享内存的准备和收尾工作

三、shmget函数(shared memory get)

1、 参数解析

(1) 第一个参数 key

(2) 第二个参数 size

(3) 第三个参数 shmget

2、返回值解析

3、使用shmget函数

4、共享内存的生命周期

四、shmctl(shared memory control)

1、参数解析

2、返回值解析

3、使用shmctl 函数

五、为什么共享内存的ID是0,1,2 ... ? 


一、什么是共享内存??

1、共享内存的定义

由于进程通信的本质是要让两个不同的进程看到同一份资源,我们可以在物理内存上开辟一块空间,这块空间被称为共享内存,然后让这两个进程通过某种方式都能访问到这块内存,这样的话,两个进程之间就可以通信了

2、共享内存的特点

第一,和创建进程类似,进程被创建的时候,会被分配一个pid来标识这个进程的唯一性,同时也方便OS管理这些进程,因此共享内存在被创建的时候,会被分配一个“ID”来标识唯一性

第二,共享内存可以允许存在多个,为了区分这些共享内存,我们上面引入了“ID”的概念,但是要如何让两个进程连上同一个共享内存呢??

就好比,我要和人solo(通信),我创建了一个房间(共享内存),这个房间就有了房间号(共享内存的ID),是个人都能进这个房间,根本没法通信,所以我们要设置房间密码。因此为了通信,我们需要两样东西,一个是房间号,一个是房间密码

二、使用共享内存的准备和收尾工作

当我们需要使用共享内存时,我们要做的准备工作是:

                — 通过某种调用,在内存中开辟一块空间(shmget)

                — 通过某种调用,让两个进程挂接到这个新开辟的空间上(shmat)

当我们不需要使用共享内存时,我们需要做的收尾工作是:

                — 断开进程和共享内存之间的关联(shmdt)

                — 释放共享内存(shmctl)

每一步都对应着一个系统调用接口,下面要说的就是这四个系统调用接口

三、shmget函数(shared memory get)

这是共享内存的创建函数,调用以后会向内核申请内存,但是需要注意的是,共享内存是以“页”为单位的,一页是4KB = 4096bytes,所以一般建议申请共享内存的大小是4KB的整数倍!

如果申请了4097个字节,那么OS会给你4096*2个字节的空间

1、 参数解析

下面是shmget函数的声明以及要用到的头文件

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值