System V IPC 中对密钥的需求

The need for a key in System V IPC

在学习信号量,特别是 System V 信号量时,我继续阅读有关 System V IPC 密钥的内容,但无法理解对此类标识符的需求。

拿回信号量,如果key标识符的用途是:

"To make it easier for different processes to get the identifier from an object they need to share (Advanced UNIX Programming, 2nd ed, pg 429)"

为什么我们不能只使用信号量 id 作为可能被不同进程使用的标识符?

P.S。 This 回答谈到了密切的主题,但没有具体提到所谓的使用对象 ID 作为标识符(而不是键)的可能性。

当几个独立的进程需要共享某个资源时,他们需要知道如何访问这个资源。例如,文件是一个共享资源,文件名告诉了如何访问这个资源。这是相当笼统的想法。

当您从独立的应用程序访问 System V IPC 资源时,您需要一种方法来识别它们。当你想打开文件时,你需要知道它的名字。当你想检查信号量时,你也需要知道它的名字。在 System V 中,这些名称采用数字键的形式(内核更容易操作)。这就是密钥的来源。 Sempahore 标识符可以是任何东西——比如文件描述符——但密钥是一成不变的东西。

也许你应该尝试回答以下问题:

您将如何组织一组进程以使用完全相同的信号量进行同步?

流程(以及人员 运行 或配置这些流程)没有 通过 id 识别信号量的简单方法。 该值是 运行 内核的内部值,下次启动时可能不存在从一次内核启动中获知的值。因此,给定一个键作为(外部)标识符,您可以轻松地将内部内核对象与外部已知名称相关联。

将外部密钥与内部对象相关联是 SysV IPC XXget() 方法所做的(使用适当的参数,即 IPC_CREATE 标志)

键就像路径名,在整个机器上是唯一的并且可以从任何进程访问。标识符类似于文件描述符,在给定进程中用于索引打开的资源。您通过将文件的路径名传递给 open(2) 来访问文件,然后使用 open(2) returns 的 fd 在 read/write/close 中引用它。您可以通过将队列的键传递给 msgget(2) 来访问队列,并使用 msgget 调用返回的 ID 在 msg* 函数中引用它。