这是我无法弄清楚的:如果你使用相同的密钥在linux上调用shmget()但是在不同的进程中,你会得到相同的shmid吗? shmid是一个短暂的值,如文件描述符号或者你可以在调用中持续存在的东西吗?
答案 0 :(得分:1)
是的,你会收到相同的shmid。共享内存描述符是内核级别,而不是进程级别。 ipcs -m
列出了共享内存段。
来自man shmctl:
成功的IPC_INFO或SHM_INFO操作返回的索引 内核内部阵列记录中使用最多的条目 有关所有共享内存段的信息。 (这个信息可以 与重复的SHM_STAT操作一起使用以获取有关的信息 系统上的所有共享内存段。)成功的SHM_STAT operation返回其共享内存段的标识符 索引以shmid给出。其他操作在成功时返回0。
来自man shmoverview
POSIX共享内存对象具有内核持久性:共享内存 对象将存在,直到系统关闭,或直到所有 进程已取消映射该对象,并已将其删除 shm_unlink(3)
答案 1 :(得分:1)
共享内存,信号量和消息队列共同的一个基本问题是不同进程如何找到正确的通信实例?请注意,POSIX(以及Linux)有两个不同的IPC系列 - 系统V和" posix" - 这是两者 POSIX标准的一部分。他们或多或少地以相同的方式解决问题,但sysV有点复杂,shmget
来自sysV沿袭。
解决方案基本上是使用路径名,因此多个进程可以访问同一个资源。 Posix IPC只使用路径名(例如shm_open
的第一个参数)。 SysV通过函数ftok运行路径名(以及"项目ID"),即" File-To-Key"到达"键"由shmget
使用。将相同的路径名和项目ID传递给ftok
将导致相同的唯一键,无论哪个进程正在执行它。
这些IPC都具有内核持久性。当没有进程不再使用它们时它们被删除(在这种情况下它们调用shmdt
)并且进程使用适当的调用(在这种情况下使用IPC_RMID选项shmctl
)删除它们。