【发布时间】:2014-05-30 11:28:15
【问题描述】:
这是我无法真正弄清楚的事情:如果您在 linux 上使用相同的密钥但在不同的进程中调用 shmget(),您会返回相同的 shmid 吗? shmid 是像文件描述符编号这样的临时值还是可以在调用中持久保存的值?
【问题讨论】:
标签: linux posix shared-memory
这是我无法真正弄清楚的事情:如果您在 linux 上使用相同的密钥但在不同的进程中调用 shmget(),您会返回相同的 shmid 吗? shmid 是像文件描述符编号这样的临时值还是可以在调用中持久保存的值?
【问题讨论】:
标签: linux posix shared-memory
共享内存、信号量和消息队列常见的一个基本问题是不同的进程如何找到合适的通信实例?请注意,POSIX(以及 Linux)有两个不同的 IPC 系列 - system V 和“posix” - 它们是 POSIX 标准的both 部分。他们以或多或少相同的方式解决问题,但 sysV 有点复杂,shmget 来自 sysV 血统。
解决方案基本上是使用路径名,以便多个进程可以访问同一资源。 Posix IPC 只使用路径名(例如shm_open 的第一个参数)。 SysV 通过函数ftok 运行路径名(连同“项目ID”),即“文件到密钥”以到达shmget 使用的“密钥”。将相同的路径名和项目 ID 传递给 ftok 将导致相同的唯一键,无论哪个进程执行此操作。
这些 IPC 都具有内核持久性。当没有进程不再使用它们时它们被删除(在这种情况下它们调用shmdt)并且进程通过适当的调用(在这种情况下使用IPC_RMID选项shmctl)删除它们。
【讨论】:
是的,您将收到相同的 shmid。共享内存描述符是内核级别的,而不是进程级别的。 ipcs -m 列出共享内存段。
来自man shmctl:
成功的 IPC_INFO 或 SHM_INFO 操作返回 内核内部数组记录中使用次数最多的条目 有关所有共享内存段的信息。 (这个信息可以 与重复的 SHM_STAT 操作一起使用以获取有关的信息 系统上的所有共享内存段。)成功的 SHM_STAT 操作返回共享内存段的标识符,其 索引在 shmid 中给出。其他操作成功返回 0。
来自man shmoverview
POSIX 共享内存对象具有内核持久性:共享内存 对象将一直存在,直到系统关闭,或者直到所有 进程已取消映射对象,并已将其删除 shm_unlink(3)
【讨论】: