Linux进程通信——共享内存

版权声明:Dream_dog专属 https://blog.csdn.net/Dog_dream/article/details/84749861

共享内存

共享内存是一种最为高效的进程间通信方式,在进程间通信时内核专门的留出一块内存区。在这段内存区可以由访问进程将其映射到自己的私有地址空间。因此进程就可以直接读写这一块内存区,极大的提高了效率。
共享内存的步骤:
(1)创建共享内存;
(2)银色贡献内存;
原理:

在这里插入图片描述

相关函数

shmget():创建一块共享内存或者获取一块已经存在的共享内存;

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/hm.h>
int shmget(key_t key, size_t size, int shmflg);
key:共享内存键值,多个进程可以通过它访问同一个共享内存。其中有特殊值
	   IPC_PRIVATE,用于创建当前进程的私有共享内存
size:共享内存区大小
shmflag:	同open()设置权限键位,可用八进制表示法
返回值:成功共享内存的标识符 	错误:-1 并设置erron

用shmget()创建共享内存时这段内核数据会被清空为0 并设置内核数据结构shmid_ds:

struct shmid_ds{    
struct ipc_perm shm_perm;  		 /* 操作权限*/
int shm_segsz;            	     /*段的大小(以字节为单位)*/
time_t shm_atime;          	     /*最后一个进程附加到该段的时间*/
time_t shm_dtime;          	     /*最后一个进程离开该段的时间*/
time_t shm_ctime;         	     /*最后一个进程修改该段的时间*/
unsigned short shm_cpid;  	     /*创建该段进程的pid*/
unsigned short shm_lpid;          /*在该段上操作的最后1个进程的pid*/
short shm_nattch;                 /*当前附加到该段的进程的个数*/
 /*下面是私有的*/
unsigned short shm_npages;        /*段的大小(以页为单位)*/
unsigned long *shm_pages;         /*指向frames->SHMMAX的指针数组*/
struct vm_area_struct *attaches;  /*对共享段的描述*/
};

shmat()将内核中的内存映射到自己的私有地址里面

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
void* shmat(int shm_id,const void * shmaddr,int shmflg);
shmid:映射的共享内存区标识符
shmaddr:将共享内存映射到指定地址(若为0则系统自动分配地址并把该段共享内存区映射到调用
		 的地址空间)最终效果受shmflg影响
shmflg:可选标志
 			SHM_RND:
 				若shmaddr为NULL则关联地址系统选择(推荐做法)
 				若shmaddr非NULL并SHM_RND未被设置,共享内存映射到指定shmaddr
 				若shmaddr非NULL并SHM_RND被设置,则关联地址为[shmaddr-(shmaddr%SHM_RND)]
 			SHM_RDONLY:进程只可读共享内存,若没有该标志则进程可直接对共享内存执行读写
 			SHM_REMAP:若果shmaddr已经关联了则重新关联
 			SHM_EXEC:指对共享内存的执行权限
返回值: 成功返回关联地址 错误:-1并设置errno

shmat() 成功时将修改内核数据结构shmid_ds:
在这里插入图片描述

shmdt()内存映射撤销

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
int shmdt(const void *shmaddr);
shmaddr:关联地址
返回值:成功0 错误-1
shmctl()系统调用控制共享内存的某些属性
#include<sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid:共享内存标识符
cmd:参数指定要直行的命令
        IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
        IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享
        内存的shmid_ds结构内
        IPC_RMID:删除这片共享内存
        IPC_INFO:获取系统内存资源配置信息,将结果储存在buf结构体中。
        SHM_INFO:与IPC_INFO类似不过返回的是已经分配好了的共享内存资源信息配置
        SHM_STAT:与IPC_STAT类似,不过此时shm_id参数不是用来表示共享内存标识符,而是内
        核中共享内存信息数组的索引
        SHM_LOCK:禁止共享内存被移动至交换区
        SHM_UNLOCK:允许共享内存被移动至交换区
返回值:成功cmd参数  错误-1并设置errno

猜你喜欢

转载自blog.csdn.net/Dog_dream/article/details/84749861