(一)共享存储允许两个或更多进程(可以不相关)共享一给定的存储区。共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到他们自己的地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由malloc分配的一样。如果某个进程向共享内存写入数据,所做的改动将立即可以访问同一段共享内存的任何其他进程看到。
并未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问。我们一般是用共享内存来提供对大内存区域的有效访问,同时通过传递小消息来同步对该内存的访问
(二)实现原理
共享内存区域说白了就是多个进程共享的一块物理内存地址,只是将这块物理内存分别映射到自己的虚拟空间地址上。假设10个进程将这块区域映射到自己的虚拟地址上,那么这10个进程就可以相互通信。由于是同一块区域在10个进程的虚拟地址上,当第一个进程向这块共享内存的虚拟地址中写入数据时,其他9个进程就都会看见。因此共享内存是进程间通讯的一种最快的方式。但是进程之间使用这块共享空间时,必须做同步控制。
(三)相关函数
(1)shmget函数:创建共享内存:
int shmget(key_t key,size_t size,int shmflg);
如果共享内存创建成功,返回一个非负整数,即共享内存标识符;如果失败,就返回-1。
第一个参数key:有效地为共享内存段命名,该函数返回一个共享内存标识符,该标识符将用于后续的共享内存函数。
第二个参数size:以字节为单位指定需要共享的内存容量。
第三个参数shmflg:包含9个比特的权限标志,它们的作用与创建文件时使用的mode标志一样。
(2)shmat函数:第一次创建共享内存时,他不能被任何进程访问。要想启用对该共享内存的访问,必须将其连接到一个进程的地址空间中。
void *shmat(int shm_id,const void *shm_addr,int shmflg);
调用成功,它返回一个指向共享内存第一个字节的指针;若果失败,它就返回-1.
第一个参数shm_id是shmget返回的共享内存标识符。
第二个参数shm_addr:指定的是共享内存连接到当前进程中的地址位置。它通常是一个空指针、表示让系统来选择共享内存出现的地址。
第三个参数shmflg:是一组位标志。
(3)shmdt函数:将共享内存从当前进程中分离。并未删除,只是使得该共享内存对当前进程不在可用。
int shmdt(const void *shm_addr);
成功时返回0,失败时返回-1.
该参数是shmat返回的地址指针。
(4)shmctl函数
int shmctl(int shm_id, int cmd,struct shmid_ds *buf);
成功时返回0,失败时返回-1。
第一个参数shm_id是shmget返回的共享内存标识符。
第二个参数command是要才去的动作,它可以取三个值,如表
第三个参数buf是一个指针,它指向包含共享内存模式和访问权限的结构。