一、共享内存
顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
二、共享内存的实现分为两个步骤:
1、 创建共享内存,使用shmget函数。
2、 映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。
三、代码实现
1、创建共享内存
<span style="font-size:14px;">#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key,size_t size,int shmflg>;
key(非0整数):为共享内存段命名,shmget成功时返回一个与key相关的内存标识符shm_id(非负整数),失败时返回-1
size:以字节为单位指定需要共享的内存容量
shmflg:权限标志,与open函数的mode参数一样,创建共享内存时此参数位可写成
IPC_CREAT | 0666</span>
2、关联共享内存
<span style="font-size:14px;">#include<sys/types.h>
#include <sys/shm.h>
void *shmat(int shm_id, const void *shm_addr, int shmflg);
shm_id: 是由shmget 函数返回的共享内存标识。
shm_addr:指定共享内存连接到当前进程的地址位置,通常为空,表示让系统来选择共享内存的地址。
shm_flg:是一组标志位,通常为0。</span>
3、取关联
<span style="font-size:14px;">#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
shmaddr:是shmat函数返回的地址指针</span><strong></strong>
4、销毁共享内存
<span style="font-size:14px;">#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shm_id, int command, struct shmid_ds *buf);
shm_id:是shmget函数返回的共享内存标识符
command: 控制共享内存要采取的操作,可以取以下三个值:
IPC_STAT : 把shmid_ds结构体中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值
IPC_SET : 如果进程有足够的权限,就把共享内存当前的关联值设置为shmid_ds结构体中给出的值
IPC_RMID : 删除共享内存段
buf : 是一个结构体指针,指向共享内存模式和访问权限的结构体
shmid_ds结构体的成员至少包括:
struct shmid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
</span>