共享内存:密钥和ID有什么区别?

当调用ipcs -akey列和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 

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

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

如果在需要密钥的地方使用IPC_PRIVATE请求资源,该进程将收到该资源的唯一密钥。 由于该资源被识别为外部人员未知的唯一密钥,因此其他进程将无法共享该资源,并且因此请求进程被保证它唯一拥有并访问该资源。

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

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