是否可以在一个应用程序中使用 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 接口使用:

较新的 Posix接口(尽管Posix似乎也标准化了SysV接口):

共享内存是可能且安全的,这样一个程序使用 shm_open() 而另一个程序使用 shmget() ?

我认为答案是否定的,虽然更聪明的人可能知道得更多。

shm_open(path,...)one 文件映射到共享内存段,而 ftok(path,id,...) 将命名的占位符文件映射到 一个或多个 段。 请参阅此相关问题 -

因此,一方面您在文件名和段之间有一对一的映射,另一方面有一对多的映射 - 如链接的问题。

此外 shmget() 使用的路径只是一个占位符。对于 shm_open() 映射可能是实际文件(尽管这是实现定义的)。

我不确定是否可以使 shm_open() 和 shmat() 引用相同的内存位置。 即使你能以某种方式混合它们,它也可能是未定义的行为。

如果您查看 shm_open 的 glibc 实现,它只是一个打开文件的包装器。 shmget and shmat 的实现是内部系统调用。

他们可能在 Linux 内核中进一步共享一个实现,但这不是应该公开或依赖的细节。