共享内存:密钥和id之间有什么区别?

时间:2013-10-22 12:59:07

标签: linux ipc shared-memory

调用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         

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

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