什么是消息队列中的目的ftok

我已经开始在Linux上阅读消息队列中的一种IPC机制。但在第一步,我有一些非常基本的问题。

  1. 使用ftok()生成唯一ID(密钥)以及要生成的唯一ID。

  2. 我们不能使用简单的数字来获取我们的密钥而不是使用ftok()吗?

  3. msget函数中参数key的用途是什么?

     #include "sys/msg.h" key = ftok("/home/beej/somefile", 'b'); msqid = msgget(key, 0666 | IPC_CREAT); 
  4. msqidkey什么区别?

ftok函数创建一种与System V IPC函数( semgetshmgetmsgget )一起使用的标识符。 可以把它想象成一个文件描述符:当你打开一个文件时,你传递一个路径来open并得到一个数字作为回报然后用于write来识别文件。 ftok函数具有类似的用途,但是filedescriptor的范围仅限于调用open (及其子节点)的进程, ftok令牌在整个系统中有效。

系统范围的原因是您希望两个或更多独立进程可以访问相同的IPC资源。 所以,如果你有两个程序,它们都执行key = ftok("/home/beej/somefile", 'b'); ,两者都将获得相同的令牌,因此可以访问相同的资源(信号量,共享内存,消息队列)。 这就是Inter Process Communication的重点。

您不能只使用“简单数字”,因为您不知道令牌是否可能是系统内部表的索引或其他内容。 换句话说,您不知道该令牌是如何在内部使用的,因此您需要使用ftok

手册页说: “指定的路径必须指定调用进程可访问的现有文件,否则调用将失败。另请注意,在给定相同ID的情况下,指向文件的链接将返回相同的密钥。” 由此我假设至少有一些ftok实现通过查找path指定的文件的inode编号来创建令牌,并将其与第二个参数组合以创建令牌。 第二个参数存在,因此您可以创建一堆IPC资源(例如几个信号量来保护不同的资源)。

至于key_t (由ftok返回的值)和msgget返回的值之间的差异:前者允许您访问一堆IPC资源(信号量,共享内存和消息队列),而后者识别特定的消息队列。

  1. 我不完全理解您的问题,但它根据给定的文件路径为系统(不是进程)生成唯一标识符。 此唯一标识符(绑定到路径)允许不同的进程绑定到同一消息队列。

  2. 是的,你可以,如果他们这样设计的话。 但是文件路径是一种更通用的方式,可以实现多个进程可以轻松访问的通用确定性密钥生成机制。

  3. 见1和2

  4. msqid类似于文件句柄,您可以向该句柄发送和接收消息。 关键是允许您将钩子关联到您感兴趣的消息队列中。作为类比,如果密钥是全局文件系统中的文件路径,那么msqid将是您的进程读取/写入它的句柄。

  1. 什么?

  2. 这可能有用,但你会选择哪一个,谁保证其他程序(或系统本身)不会使用相同的数字? 这会导致混乱。

  3. 目的是提供系统范围的唯一值以识别消息队列。 正如联机帮助页所述,

    通常,尽力而为尝试将给定的proj_id字节,inode编号的低16位和设备编号的低8位组合成32位结果。 可能很容易发生冲突,例如/ dev / hda1上的文件和/ dev / sda1上的文件之间。

    所以它只需要一个文件并计算一个ID,从中可以知道使用相同文件和项目ID的另一个程序将获得相同的结果。

  4. key只是一个唯一但可以用于其他目的的标识符,而msqid是真正存在的队列的ID(句柄类型)。