Linux shmget()返回的shmid是否在所有进程中都是唯一的?
这是我无法真正弄明白的:如果在linux上使用相同的密钥但在不同的进程中调用shmget(),您是否会返回相同的shmid?shmid是一个短暂的值,比如文件描述符号,还是可以跨调用持久化的值?是的,您将收到相同的shmid。共享内存描述符是内核级的,而不是进程级的Linux shmget()返回的shmid是否在所有进程中都是唯一的?,linux,posix,shared-memory,Linux,Posix,Shared Memory,这是我无法真正弄明白的:如果在linux上使用相同的密钥但在不同的进程中调用shmget(),您是否会返回相同的shmid?shmid是一个短暂的值,比如文件描述符号,还是可以跨调用持久化的值?是的,您将收到相同的shmid。共享内存描述符是内核级的,而不是进程级的ipcs-m列出共享内存段 发件人: 成功的IPC_INFO或SHM_INFO操作将返回 内核内部数组记录中使用次数最高的条目 有关所有共享内存段的信息。(此信息可以 与重复的SHM_STAT操作一起使用,以获取有关 系统上的所有共享
ipcs-m
列出共享内存段
发件人:
成功的IPC_INFO或SHM_INFO操作将返回
内核内部数组记录中使用次数最高的条目
有关所有共享内存段的信息。(此信息可以
与重复的SHM_STAT操作一起使用,以获取有关
系统上的所有共享内存段。)成功的SHM_STAT
操作返回共享内存段的标识符
指数用shmid表示。其他操作成功时返回0
以及从manshmoverview
POSIX共享内存对象具有内核持久性:共享内存
对象将一直存在,直到系统关闭或所有
进程已取消映射对象,并已使用删除该对象
shm_解除链接(3)
共享内存、信号量和消息队列常见的一个基本问题是,不同的进程如何找到合适的通信实例?请注意,POSIX(以及Linux)有两个不同的IPC系列——SystemV和“POSIX”——它们都是POSIX标准的一部分。它们或多或少以相同的方式解决问题,但sysV有点复杂,而且
shmget
来自sysV血统
解决方案基本上是使用路径名,以便多个进程可以访问同一资源。Posix IPC只需使用路径名(例如shm_open
的第一个参数)。SysV通过函数运行路径名(以及“项目id”),即“文件到键”,以获得shmget
使用的“键”。将相同的路径名和项目id传递给ftok
将产生相同的唯一键,而不管是哪个进程执行此操作
这些IPC都具有内核持久性。当没有进程再使用它们时,它们将被删除(在本例中,它们调用shmdt
),进程将通过适当的调用(在本例中,使用IPC\u RMID选项shmctl
)删除它们