Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux shmget()返回的shmid是否在所有进程中都是唯一的?_Linux_Posix_Shared Memory - Fatal编程技术网

Linux shmget()返回的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操作一起使用,以获取有关 系统上的所有共享

这是我无法真正弄明白的:如果在linux上使用相同的密钥但在不同的进程中调用shmget(),您是否会返回相同的shmid?shmid是一个短暂的值,比如文件描述符号,还是可以跨调用持久化的值?

是的,您将收到相同的shmid。共享内存描述符是内核级的,而不是进程级的
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
)删除它们