在学习信号量,特别是System V信号量时,我开始阅读有关System V IPC密钥的内容,但无法理解对此类标识符的需求。
如果密钥标识符的用途是:
,则将其恢复为信号量"使不同进程更容易获取标识符 来自他们需要共享的对象(Advanced UNIX Programming,2nd ed,pg 429)"
为什么我们不能将信号量id用作可能被不同进程使用的标识符?
P.S。 This回答谈论近似主题,但并未特别提到使用对象ID作为标识符(而不是密钥)的可能性。
答案 0 :(得分:2)
您可以尝试回答以下问题:
如何组织一组进程以使用相同的信号量进行同步?
流程(以及运行或配置这些流程的人员)没有 通过id识别semapohre的简单方法。 此值是正在运行的内核的内部值,下次启动时可能不存在从一个内核引导中获知的值。因此,给定一个密钥作为(外部)标识符,您可以轻松地将内部内核对象与外部已知名称相关联。
将外部键与内部对象相关联是SysV IPC XXget()方法的作用(使用适当的参数,即IPC_CREATE标志)
答案 1 :(得分:0)
当几个独立的进程需要共享某个资源时,他们需要知道如何访问该资源。例如,file是共享资源,文件名说明如何访问此资源。这是一个非常通用的想法。
当您从独立应用程序访问System V IPC资源时,您需要一种方法来识别它们。当您想要打开文件时,您需要知道它的名称。当你想检查信号量时,你也需要知道它的名字。在System V中,这些名称采用数字键的形式(内核更容易操作)。这是钥匙的来源。 Sempahore标识符可以是任何东西 - 比如文件描述符 - 但是密钥是固定的。
答案 2 :(得分:0)
键就像路径名,在整个机器上是唯一的,可以从任何进程访问。标识符就像文件描述符,在给定的进程中用于索引开放资源。您可以通过将其路径名传递给open(2)来访问文件,然后使用open(2)返回的fd在read / write / close中引用它。您可以通过将其密钥传递给msgget(2)来访问队列,并使用msgget调用返回的id在msg *函数中引用它。