共享内存
Linux命令:
ipcs -m //查看存在的共享内存信息
ipcrm -m (shmid) //删除对应shmid的共享内存
shmget
#include <sys/shm.h>
#include <sys/types,h>
int shmget(key_t key,int size,int shmflg); //创建共享内存
参数 key: 为共享内存的key,唯一标识系统中一块共享内存,为int型 。
参数 size:为共享内存创建时指定的大小,参数size为整型值表示共享内存创建的长度,该参数表示的大小是以字节为单位 。
参数 shmflg:指定共享内存创建时的标志,主要包含IPC_CREAT与IPC_EXCL两个标志 。
shmflg为 IPC_CREAT 时表示如果系统中指定的共享内存不存在,则创建新的共享内存,否则打开获取共享内存的操作符 。
shmflg 为 IPC_EXCL 时则表示只有共享内存不存在时,新的共享内存才会创建,否则将会报错 。
返回值:共享内存创建成功返回shmid ,失败返回-1 。
shmat
#include <sys/ipc.h>
#include <sys/shm.h>
void *shmat(int shmid,const void *shmaddr,int shmflg); //映射共享内存
参数 shmid:为共享内存在系统中的标识值,该值为shmget方法创建并返回的共享内存标识号 。
参数 shmaddr:为指向共享内存映射到进程空间的首地址,如果设定为NULL,则系统会返回一个合适的共享内存可操作的地址供应用程序读写操作使用 。
参数 shmflg:为0表示对进程空间权限为可读可写 。
返回值:返回相应的映射的共享内存可操作首地址 失败返回(void *)-1 。
shmdt
#include <sys/ipc.h>
#include <sys/shm.h>
int shmdt(const void* shmaddr); //与共享内存映射解除
参数 shmaddr:shmat映射时返回的可操作的共享内存首地址 。
返回值:成功解除映射返回0,失败返回-1 。
shmctl
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf); //对共享内存进行各种操作
参数 shmid:是函数shmget函数返回的共享内存标识符 。
参数 cmd:对共享内存的操作命令 。
cmd为命令 IPC_RMID 时:销毁共享内存,销毁后,所有的shmat,shmdt,shmctl对该片内存操都将失效,参数buf设置为NULL 。
cmd为命令 IPC_SET 时:设置shmid_ds结构成员 。
cmd为命令IPC_STAT 时 :检索该共享段的shmid_ds结构,把它存到buf参数的地址中 。
参数 buf:shmid_ds类型的指针 。
//内核为每一个共享内存段维护着一个特殊的数据结构,即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; /*对共享段的描述*/
};
返回值:成功返回0,失败返回-1 。