【问题标题】:Shared memory: what's the difference between the key and the id?共享内存:key 和 id 有什么区别?
【发布时间】:2013-10-31 08:48:24
【问题描述】:

调用ipcs -a时,key列和id列有什么区别?

这是ipcs 命令的示例输出:

ipcs -a

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 0          ybaumes    600        393216     2          dest         
0x00000000 65537      ybaumes    700        8124648    2          dest         
0x00000000 3932163    ybaumes    700        169376     2          dest         
0x00000000 3604485    ybaumes    600        393216     2          dest         

【问题讨论】:

    标签: linux ipc shared-memory


    【解决方案1】:

    首先,共享内存中的“id”列指的是共享内存区域的特定处理程序。如果没有获取到共享内存区域,则返回负值。所以基本上,“id”是由系统生成的,用户无法控制它。

    而 ipcs 命令中的“key”列是指在参考进程间通信资源(如共享内存、消息队列和信号量)时给出的值。 '一个键只是一个 key_t 类型的整数'。此外,key 参数是与信号量 ID 相关联的访问值。它可以是简单的整数,例如。 34562,可以在使用关联的 get 函数创建这些资源时传递。 需要密钥的地方接受一个特殊的参数,IPC_PRIVATE。在这种情况下,系统将生成唯一的密钥,并保证没有其他进程具有相同的密钥。

    如果在需要密钥的地方使用 IPC_PRIVATE 请求资源,则该进程将收到该资源的唯一密钥。由于该资源是用外部未知的唯一密钥标识的,因此其他进程将无法共享该资源,因此,请求进程可以保证它拥有并独占访问该资源。

    这个概念在用于消息队列时会变得更加清晰,在消息队列中会生成并使用特定的键值发送消息。只有在接收端匹配给定的密钥时,才能在接收端接收相同的消息。因为,还有返回值给出了消息id,它是根据对应的key值计算出来的,主要相关性是检查资源的唯一性。

    【讨论】:

      【解决方案2】:

      请参阅 shmget(2) 的文档。键是 IPC_PRIVATE 或创建时为 0。 shmid 是为该特定 shm 段返回的值,以便其他进程或系统调用可以引用该段。

      【讨论】:

        猜你喜欢
        • 2012-10-31
        • 2012-12-15
        • 2015-01-13
        • 2018-03-27
        • 2012-11-27
        • 2010-12-23
        • 2023-04-07
        • 2012-08-03
        • 2014-07-01
        相关资源
        最近更新 更多