共享存储允许两个或者多个进程共享一个给定的存储区。因为数据不需要在客户进程和服务器进程之间进行复制,所以这是最快的一种IPC。通常,使用信号量同步共享存储访问。
调用的第一个函数通常是shmget,它获得一个共享存储标识。
#include <sys/shm.h> int shmget(key_t key, size_t size, int flag); 返回值:若成功,返回共享存储ID;若出错,返回-1 |
---|
参数size是该共享存储段的长度,以字节为单位。如果正在创建一个新段,则必须指定其size。如果正在引用一个现存的段,则将size指定为0。当创建一个新段时,段内的内容初始化为0。
shmctl函数对共享存储段执行多种操作。
#include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf); 返回值:若成功,返回0;若出错,返回-1 |
---|
cmd参数指定下列5中命令的一种,使其在shmid指定的段上执行。
宏定义 | 作用 |
---|---|
IPC_STAT | 获取此段的shmid_ds结构,并将它存储在由buf指向的结构中。 |
IPC_SET | 按buf指向的结构中的值设置与此共享存储段相关的shmid_ds结构中的shm_perm.uid、shm_perm.gid和shm_perm.mode成员。 |
IPC_RMID | 从系统中删除该共享内存段 |
SHM_LOCK | 在内存中对共享内存中加锁。此命令只能由超级用户执行。 |
SHM_UNLOCK | 解锁共享内存段。此命令只能由超级用户执行。 |
一旦创建了一个共享内存段,进程就可以调用shmat将其连接到它的地址空间中。
#include <sys/shm.h> void shmat*(int shmid, const void *addr, int flag); 返回值:若成功,返回指向共享存储段的指针;若出错,返回-1 |
---|
分离共享存储可使用shmdt函数。
#include <sys/shm.h> int shmdt(const void *addr); 返回值:若成功,返回0;若出错,返回-1 |
---|
shmdt并不从系统中删除其标识符以及其相关的数据结构。该标识符依然存在,直至某个进程调用shmctl函数删除它位置。