system V——共享内存

system V

SystemV标准的进程间通信方式是在操作系统层面专门为进程间通信设计的一个方案。进程间通信的本质就是让不同的进程能够看到同一份资源。
常见的system V结构的通信方式有如下几种:
共享内存
消息队列
信号量
这篇博客主要介绍基于共享内存的进程间通信方式。

共享内存

共享内存是通过某种调用,在内存中创建一份内存空间,然后通过函数调用,让需要参与进程通信的进程挂接到这个内存空间上,让不同的进程得以看到同一份空间,以此来实现进程间的通信。因此共享内存的使用可以分为如下四个阶段:开辟内存空间,挂接,去挂接,释放共享内存。
操作系统中可能同时有多个进程,他们需要使用不同的共享内存空间,这个时候就需要对共享内存空间进行管理,操作系统管理的方式都是先描述再组织,因此为了保证多个进程能够看到同一个共享内存空间,这里的共享内存也会有类似文件描述符,用于进行唯一标识的ID,这个ID就存放在共享内存的结构体中。

struct shmid_ds {
   
 struct ipc_perm shm_perm; /* operation perms */
 int shm_segsz; /* size of segment (bytes) */
 __kernel_time_t shm_atime; /* last attach time */
 __kernel_time_t shm_dtime; /* last detach time */
 __kernel_time_t shm_ctime; /* last change time */
 __kernel_ipc_pid_t shm_cpid; /* pid of creator */
 __kernel_ipc_pid_t shm_lpid; /* pid of last operator */
 unsigned short shm_nattch; /* no. of current attaches */
 unsigned short shm_unused; /* compatibility */
 void *shm_unused2; /* ditto - used by DIPC */
 void *shm_unused3; /* unused */
};

共享内存函数接口

shmget

根据上面所说,要想使用共享内存进行进程间通信,第一步就是开辟共享内存空间,这里开辟共享内存空间的函数是shmget
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1
在这里插入图片描述
先来介绍需要传入的第二个参数,size代表需要开辟的共享内存空间的大小,一般是4096的整数倍,也就是4kb的整数倍,如果传入4097他会进行向上取整
最后一个flag参数:和IO函数中的flag类似,常用的参数有如下两种:
在这里插入图片描述
IPC_CREAT:如果单独使用IPC_CREAT或者flag为0是创建一个共享内存,如果创建的共享内存已经存在则直接返回当前已经存在的共享内存,不存在则创建
IPC_EXCL:单独使用没有意义,一般会搭配上面的选项使用| ,如果不存在共享内存则创建,如果已经有了共享内存,则返回出错,意义在于如果调用成功,得到的一定是一个全新的没有被使用的共享内存
在flag后面还可以加上权限限定类似于创建文件的操作。

key

其中key是一个全新类型的参数key_t类型,他的作用是通过在生成key时候,输入不同的自定义路径和项目ID来实现类似于加密的功能,来生成不同的key值,以此来实现同一个key值可以访问同一个共享内存空间,否则就会生成新的共享内存空间。key值的生成需要使用ftok接口函数
在这里插入图片描述
这里第一个参数传入的是自定义的系统路径,第二个传入的是自定义项目ID,以此来形成特定的key值。

int main()
{
   
  key_t key = ftok(PATH_NAME,PROJ_ID);
  if(key<0)
  {
   
    perror("ftok");
    return 
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值