简介:
是最快的可用IPC形式。进程可以直接读写内存,而不需要任何数据的拷贝。
使得多个进程可以访问同一块内存空间,是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
原理:
进程间需要共享的数据被放在一个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。系统V共享内存通过shmget获得或创建一个IPC共享内存区域,并返回相应的标识符。内核在保证shmget获得或创建一个共享内存区,初始化该共享内存区相应的shmid_kernel结构注同时,还将在特殊文件系统shm中,创建并打开一个同名文件,并在内存中建立起该文件的相应dentry及inode结构,新打开的文件不属于任何一个进程(任何进程都可以访问该共享内存区)。所有这一切都是系统调用shmget完成的。
操作流程:
创建/打开共享内存 --> 映射共享内存(把指定的共享内存映射到进程的地址空间,用于访问) --> 撤销共享内存映射 --> 删除共享内存对象
相关的API:
key_t ftok(const char* pathname, int proj_id) //#include <sys/types.h> #include <sys/ipc.h>
//#include <sys/ipc.h> #include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg)
void * shmat(int shmid, const void * shmaddr, int shmflg)
int shmdt(const void * shmaddr)
int shmctl(int shmid, int cmd, struct shmid_ds * buf)