这是我真的搞不懂的:如果您在linux上用相同的键但在不同的进程中调用shmget(),您会不会得到相同的shmid?shmid是一个短暂的值,类似于一个文件描述符号,还是可以在调用中持久化的东西?
发布于 2014-04-15 22:01:19
是的,你会得到同样的施密德。共享内存描述符是内核级,而不是进程级.ipcs -m列出共享内存段。
来自曼斯克特
成功的IPC_INFO或SHM_INFO操作返回内核内部数组中最高使用项的索引,记录所有共享内存段的信息。(此信息可与重复的SHM_STAT操作一起使用,以获得有关系统上所有共享内存段的信息。)成功的SHM_STAT操作返回共享内存段的标识符,共享内存段的索引是在shmid中给出的。其他操作在成功时返回0。
来自man shmoverview
POSIX共享内存对象具有内核持久性:共享内存对象将一直存在,直到系统关闭,或直到所有进程取消对该对象的映射,并且该对象已被shm_unlink(3)删除。
发布于 2014-04-16 00:23:27
共享内存、信号量和消息队列共有的一个基本问题是,不同的进程如何找到适当的通信实例?请注意,POSIX (因此还有Linux)有两个不同的IPC家族-- system和" POSIX“--它们都是POSIX标准的一部分。他们或多或少地以同样的方式解决了这个问题,但是sysV有点复杂,而shmget来自于sysV的血统。
解决方案基本上是使用路径名,以便多个进程可以访问相同的资源。Posix只使用路径名(例如,shm_open的第一个参数)。SysV通过函数托克运行路径名(以及一个“项目id"),即”文件到键“,以到达shmget使用的”键“。将相同的路径名和项目id传递给ftok将产生相同的唯一键,而不管哪个进程正在执行。
这些IPC都具有内核持久性。当不再使用它们(在本例中称为shmdt )时,它们将被删除,并且一个进程使用适当的调用(在本例中为shmctl带有IPC_RMID选项)删除它们。
https://stackoverflow.com/questions/23095076
复制相似问题