共享内存是最高效的IPC机制,具体概念参考[《《操作系统概念精要》基本概念整理之进程同步篇(二)》],(https://www.jianshu.com/p/45c546d98e1c),这里不再赘述。
Linux System V共享内存的API定义都在<sys/shm.h>中。包括4个系统调用:shmget,
shmget 系统调用
// key表示一个键值,用来标识一段全局唯一的共享内存
// size 是指定共享内存的大小,单位是字节
// shmflg的参数和信号量的参数一样
shmget(key_t key, size_t size, int shmflg);
shmget 成功返回一个正整数,他是共享内存的标识符。shmget 失败返回-1,并且设置errno。
如果shmget用于创建共享内存,那么这段共享内存都会初始化为0。
shmat 和shmdt 系统调用
共享内存被创建/获取之后,他们不能立即访问他,而是需要把它关联到进程的地址空间中,使用完成后,需要把它从进程空间中分离。这项任务分别由以下两个系统调用实现。
#include <sys/shm.h>
// shm_id是共享内存标识符, shm_addr 参数指定将共享内存关联到进程的那块地址空间,最后的效果还是要收到shmflg参数来决定的。shm_addr 为NULL,由操作系统来映射。
void* shmat(int shm_id, const void* shm_addr, int shmflg);
// shmdt 将关联到shm_addr处的共享内存从进程中分离,
int shmdt(const void * shm_addr);
shmat 成功时返回共享内存被关联到的地址。 失败则会返回 (void*)-1,并设置errno。
shmdt 成功返回0, 失败返回-1 ,并设置errno。
shmctl系统调用
shmctl 系统调用控制共享内存的某些属性。
int shmctl(int shm_id, int command, struct shmid_ds* buff);
网友评论