POSIX 共享内存
与共享文件映射的区别
POSIX 共享内存能够让无关进程共享一个映射区域而无需创建一个相应的映射文件
- POSIX共享内存主要用于 进程间通信
- 共享文件映射主要用于 磁盘文件IO
创建共享内存对象
int shm_open(const char *name, int oflag, mode_t mode);
shm_open()函数创建和打开一个新的共享内存对象或打开一个既有对象
与open()
调用类似
共享内存对象的使用
-
使用
shm_open()
函数创建或打开一个共享内存对象(与文件描述符的使用类似) -
一个新共享内存对象被创建时其初始长度会被设置为0。这意味着在创建完一个新共享内存对象之后通常在调用
mmap()
之前需要调用ftruncate()
来设置对象的大小 -
将文件描述符传入
mmap()
并在其flags参数中指MAP_SHARED
。这会 将共享内存对象映射进进程的虚拟地址空间 -
一旦映射了对象之后就能够关闭该文件描述符而不会影响到这个映射(关闭后会影响后续的操作)
-
使用
ftruncate()
来根据需求 扩大或收缩 共享内存对象(扩大时,新增的字节初始化为0)
// 使用的框架
int fd = shm_open(name, oflgs, mode); // 名字必须斜线开头,/demo_shm
ftruncate(fd, len); // 扩展共享内存对象的大小,为mmap做准备
void *addr = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHAERD, fd, 0); // 进程间的通信,可以通过对这块共享内存映射的读写实现
close(fd); // 关闭文件描述符,后续可以用 addr 操作
// 待进程间通信结束后,删除共享内存对象,删除共享文件映射
删除共享内存对象
POSIX共享内存对象至少具备内核持久性,即它们会持续存在直到被显式删除或系统重启。当不再需要一个共享内存对象时就应该使用shm_unlink()删除它
int shm_unlink(const char *name);
标签:映射,对象,POSIX,共享内存,open,shm
From: https://www.cnblogs.com/dylaris/p/18522257