是否可以在一个应用程序中使用 SysV shmat() 接口共享内存,而在另一个应用程序中使用 Posix shm_open() 接口?
Is it possible to share memory using the SysV shmat() interface in one application and the Posix shm_open() interace in another?
忽略一些细节,Linux 中有两个可用的低级 SHM API。
我们有 旧的(例如 System V IPC vs POSIX IPC)SysV 接口使用:
- ftok
- shmctl
- shmget
- shmat
- shmdt
和较新的 Posix接口(尽管Posix似乎也标准化了SysV接口):
- shm_open
- shm_unlink
共享内存是可能且安全的,这样一个程序使用 shm_open() 而另一个程序使用 shmget() ?
我认为答案是否定的,虽然更聪明的人可能知道得更多。
shm_open(path,...) 将 one 文件映射到共享内存段,而 ftok(path,id,...) 将命名的占位符文件映射到 一个或多个 段。
请参阅此相关问题 -
因此,一方面您在文件名和段之间有一对一的映射,另一方面有一对多的映射 - 如链接的问题。
此外 shmget() 使用的路径只是一个占位符。对于 shm_open() 映射可能是实际文件(尽管这是实现定义的)。
我不确定是否可以使 shm_open() 和 shmat() 引用相同的内存位置。
即使你能以某种方式混合它们,它也可能是未定义的行为。
如果您查看 shm_open 的 glibc 实现,它只是一个打开文件的包装器。
shmget and shmat 的实现是内部系统调用。
他们可能在 Linux 内核中进一步共享一个实现,但这不是应该公开或依赖的细节。
忽略一些细节,Linux 中有两个可用的低级 SHM API。
我们有 旧的(例如 System V IPC vs POSIX IPC)SysV 接口使用:
- ftok
- shmctl
- shmget
- shmat
- shmdt
和较新的 Posix接口(尽管Posix似乎也标准化了SysV接口):
- shm_open
- shm_unlink
共享内存是可能且安全的,这样一个程序使用 shm_open() 而另一个程序使用 shmget() ?
我认为答案是否定的,虽然更聪明的人可能知道得更多。
shm_open(path,...) 将 one 文件映射到共享内存段,而 ftok(path,id,...) 将命名的占位符文件映射到 一个或多个 段。
请参阅此相关问题 -
因此,一方面您在文件名和段之间有一对一的映射,另一方面有一对多的映射 - 如链接的问题。
此外 shmget() 使用的路径只是一个占位符。对于 shm_open() 映射可能是实际文件(尽管这是实现定义的)。
我不确定是否可以使 shm_open() 和 shmat() 引用相同的内存位置。 即使你能以某种方式混合它们,它也可能是未定义的行为。
如果您查看 shm_open 的 glibc 实现,它只是一个打开文件的包装器。 shmget and shmat 的实现是内部系统调用。
他们可能在 Linux 内核中进一步共享一个实现,但这不是应该公开或依赖的细节。