目录
为什么要有共享内存?
共享内存是进程间通信方法中最快的一种,因为它不需要调用系统接口,直接在内存级进行操作,不涉及内核
它存在于内存的共享区:
查看、删除共享内存
【查看创建的共享内存】
ipcs -m
【删除共享内存】
ipcrm -m [shmid]
关于共享内存的有关函数
【shmget】
int shmget(size_t key,size_t size, int shmflg)
目的是用来创建一个共享内存以供使用,返回值是int,key代表这个共享内存段的名字,一般用ftok生成,size为此共享内存的大小(必须为页的整数倍)shmflg是打开的形式
1.ftok:通过一个存在的文件名和自己在0-255中选择的8bit整数,生成一个唯一的key,作为共享内存的中间标识
2.页:一个页是4KB,也就是4096字节
3.shmflg中,未存在的可以使用IPC_CREAT | IPC_EXCL,已存在的可以使用IPC_CREAT或者传0
【shmmat】
void *shmat(int shmid, const void *shmaddr, int shmflg)
目的是将共享内存挂接到进程地址空间中,返回值是void* shmid是指在shmget中生成的id,shmaddr为共享内存挂接的地址,shmflg也是挂接方式
1.关于返回值:如果成功则返回共享存储段的指针(虚拟地址),并且内核将使其与该共享存储段相关的shmid_ds结构中的shm_nattch计数器加1(类似于引用计数)
2.shmaddr:一般为0,及内核可以选择的第一个地址上(一般为这个进程自己
3.shmflg:如果指定了SHM_RDONLY,则以只读方式打开此段,否则以读写方式打开
【shmdt】
int shmdt(const void *shmaddr);
起到去关联的作用(即取消共享内存与进程间的关联),返回值在函数成功时返回0,否则返回-1,内部的shmaddr指关联时返回的那个虚拟地址,需要指定了才能去关联
【shmctl】
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
用于共享内存的控制(可以用来删除),成功时返回0,失败返回-1,shmid是shmget时返回的id值,cmd是用于控制共享内存的命令,buf则置为NULL即可
1.cmd种类:IPC_STAT(把shmid_ds结构中的数据设置为共享内存的当前关联值)、IPC_SET(在进程有足够的权限下,把共享内存的当前关联值设置为shmid_ds结构中给出的值)、IPC_RMID(删除共享内存段)
2.shmid_ds* buf:是一个指向一个保存着共享内存模式状态和访问权限的数据结构