1.概述
共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,它是在多进程之间对内存段进行映射的方式实现内存共享的。这是IPC最快捷的方式,共享内存方式的通信过程没有中间过程,共享内存直接将某段进行映射,多个进程间的共享内存是同块内存物理空间,仅仅是地址(逻辑地址)不同而已,不需要复制。
2.相关操作函数
创建共享内存函数原型:
shmget(key_tkey, size_t size, int shmflg);
shmflg的值如下:
IPC_CREAT:如果内核不存在,则创建它。
IPC_EXCL:当与IPC_CREAT一起使用时,如果内存段早已存在,则此次调用失败。
获得共享内存地址函数原型:
void*shmat(int shmid, const void *shmaddr, int shmflg);
删除共享内存函数原型:
intshmdt(const void *shmaddr);
共享内存控制函数原型:
intshmctl(int shmid, int cmd, struct shmid_ds *buf);
结构shmid_ds结构定义如下:
structshmid_ds
{
structipc_perm shm_perm; //所有者和权限
size_tshm_segsz; //段大小,以字节为单位
time_tshm_atime; //最后挂接时间
time_tshm_dtime; //最后取出时间
time_tshm_ctime; //最后修改时间
pid_tshm_cpid; //建立者的PID
pid_tshm_lpid; //最后调用函数shmat()/shmdt()的PID
shmatt_tshm_nattch; //现在挂接的数量
…
};
3.实例
/*---------------共享内存操作实例--------------------*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#defineBUFSZ 2048
intmain()
{
intshmid;
char*shmadd;
key_tkey;
/*生成键值*/
if((key= ftok(".", 'a')) == -1)
{
perror("ftok");
exit(1);
}
if((shmid= shmget(key, BUFSZ, IPC_CREAT | 0666)) < 0)
{
perror("shmget");
exit(1);
}
else
{
printf("createdshared-memory: %d\n", shmid);
system("ipcs–m");
}
if((shmadd= shmat(shmid, 0, 0)) < (char*)0)
{
perror("shmat");
exit(1);
}
else
{
printf("attachedshared-memory\n");
system("ipcs–m");
}
if(shmdt(shmadd)< 0)
{
perror("shmdt");
exit(1);
}
else
{
printf("dettachedshared-memory\n");
system("ipcs-m");
}
exit(0);
}