1. Linux的两种共享内存机制,及选用
shmget
和 shm_open
是两种不同的共享内存机制,它们在使用方式和本质上有所不同。
1.1 System V 共享内存
shmget
是 POSIX 标准中定义的 System V 共享内存的接口函数。- System V 共享内存是一种传统的 UNIX 共享内存机制,使用
shmget
函数创建的共享内存对象被映射到进程的地址空间中,进程可以直接访问共享内存区域,而无需通过文件系统。 - System V 共享内存需要使用键值来唯一标识共享内存对象,进程可以使用该键值来获取或创建共享内存对象。
- System V 共享内存需要使用额外的信号量进行同步和互斥操作,以避免竞争条件和数据损坏。
1.2 映射文件共享内存
shm_open
是 POSIX 标准中定义的另一种共享内存机制,属于 POSIX 共享内存对象。- POSIX 共享内存是一种基于文件的共享内存机制,使用
shm_open
函数创建的共享内存对象实际上对应着文件系统中的一个特殊文件。 - 与 System V 共享内存不同,POSIX 共享内存可以直接通过文件系统访问和管理,进程可以像操作普通文件一样来操作共享内存对象。
- POSIX 共享内存不需要使用键值来标识共享内存对象,而是使用文件路径来唯一标识共享内存对象,这样更加简洁和直观。
- POSIX 共享内存不需要使用额外的信号量进行同步和互斥操作,而是通过操作系统提供的文件锁机制来实现并发访问的同步。
由于要考虑跨平台封装,windows上共享内存映射也是文件系统相关,所以选择映射文件
的这个套机制
2. 查看共享内存分配情况
2.1 POSIX - System V
虽然我们选用了映射文件共享内存的方式,但是还是简单提一下system v共享内存机制查看已分配内存的方式
|
|
2.2 POSIX - 映射文件共享内存
|
|
2.3 Windows
windows无法像linux那样列出所有系统中的共享内存文件,只能通用微软的运维工具process explorer
查看section类型的句柄
3. 封装代码
|
|
使用示例,
|
|
4. 注意事项
4.1 链接库
linux下需要链接rt库
|
|
4.2 权限问题
linux上 ,执行sub_open的进程如果是root,那么要打开这个共享内存文件,也需要是以root启动的进程
否则 map返回的addr可能会是 MAP_FAILED
,注意,map失败不是返回nullptr
,是MAP_FAILED
也就是 (void*)-1
参考
Creating Named Shared Memory - Win32 apps | Microsoft Learn
>> Home
Comments