linux - 共享内存 : what's the difference between the key and the id?

标签 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         

最佳答案

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

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

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

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

关于linux - 共享内存 : what's the difference between the key and the id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19518607/

相关文章:

linux - 如何调试 "Program received signal SIGSEGV: Segmentation fault"的错误

Java MySQL 连接

c - 如何在linux上的两个进程之间使用c中的posix命名信号量来共享内存?

linux - 为什么在管道末端使用时无法读取填充变量?

linux - 为什么 du 给出不同的结果?

c - 删除消息队列

android - 当您可以使用静态变量执行相同的任务时,为什么要使用 parcelable?

unix - 如何自动删除 Unix IPC 资源?

c - 无法访问 `open()` 和 `mmap()` 之后的数据结构 - 总线错误

c - 如何向套接字发送信号?