共享内存与文件的关系
Relationship between shared memory and files
忽略一些细节,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() ,则可以将多个段与单个路径相关联,例如:
key1=ftok(path,1);
key2=ftok(path,2);
shmget(key1,...)
shmget(key2,...)
在这种情况下文件和段之间的关系如果有什么关系呢?
给 ftok 的路径只是一个占位符。我看不出它有什么用。
如果我们将 Unix 哲学视为一切皆文件,那为什么这不是一对一的映射?
独立但相关的问题:
- 是否应将 SysV 接口视为弃用?
中没有这样的建议
我只能找到模糊的建议,例如:
我认为 SysV 的线程安全性较低。
在现代应用程序中,您是否更喜欢 SysV(或 posix)?
ftok 的路径只是“一切皆文件”传统中的一个占位符。
经过一段时间考虑,我会说 mmap 更简单、更安全、更有效 API。如果可能的话,我个人会完全避免使用 shmget 等。
shmget()后清理特别尴尬见:
另请参阅:
- Linux shared memory: shmget() vs mmap()?
- System V IPC vs POSIX IPC
在其中一个相关问题中支持 system-v 的一个论据是 Posix 的实施范围较小。我不知道那是不是真的,但现在看来更不可能了。鉴于 GNU/Linux 和 BSD 衍生品的主导地位。即使是传说中的 'unique' AIX 现在也声称 Posix 合规。
忽略一些细节,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() ,则可以将多个段与单个路径相关联,例如:
key1=ftok(path,1);
key2=ftok(path,2);
shmget(key1,...)
shmget(key2,...)
在这种情况下文件和段之间的关系如果有什么关系呢? 给 ftok 的路径只是一个占位符。我看不出它有什么用。 如果我们将 Unix 哲学视为一切皆文件,那为什么这不是一对一的映射?
独立但相关的问题:
- 是否应将 SysV 接口视为弃用?
我只能找到模糊的建议,例如:
我认为 SysV 的线程安全性较低。
在现代应用程序中,您是否更喜欢 SysV(或 posix)?
ftok 的路径只是“一切皆文件”传统中的一个占位符。
经过一段时间考虑,我会说 mmap 更简单、更安全、更有效 API。如果可能的话,我个人会完全避免使用 shmget 等。
shmget()后清理特别尴尬见:
另请参阅:
- Linux shared memory: shmget() vs mmap()?
- System V IPC vs POSIX IPC
在其中一个相关问题中支持 system-v 的一个论据是 Posix 的实施范围较小。我不知道那是不是真的,但现在看来更不可能了。鉴于 GNU/Linux 和 BSD 衍生品的主导地位。即使是传说中的 'unique' AIX 现在也声称 Posix 合规。