访问由IPC_PRIVATE

时间:2019-04-24 15:18:15

标签: c ipc message-queue shared-memory

我正在尝试为项目同步并使一些线程/进程进行通信,并且理想情况下,我希望访问它们之间的一些共享内存块,而又不要与其他进程/资源冲突。

我知道IPC_PRIVATE在调用shmget()创建该密钥时会生成一个唯一密钥,但是如果我随后需要该密钥在其他进程中的某个地方打开该区域,我如何访问该生成的key_t值以便将其发送到另一个过程?

我目前正在通过IPC消息队列发送数据,因此我可以发送shmid值,但据我所知,由于shmid值对于每个进程都是唯一的,因此不起作用。

除了别的ftok()和一些随机文件,我别无选择吗? 我要为要创建的不同共享内存的每个块选择不同的文件吗?

谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

  

我知道IPC_PRIVATE在调用shmget()创建它时会生成一个唯一密钥

不,您误会了。 IPC_PRIVATE不会生成一个key_t,它一个key_t。这种特殊的key_t引起了shmget()的特殊行为,即总是创建一个新段,而忽略除模式位以外的所有标志位。

  

如果我随后需要该密钥在其他进程中的某个地方打开该区域,该如何访问生成的key_t值,以便将其发送给其他进程?

由于总是使用IPC_PRIVATE获得一个新段,因此每个进程之间无法通过该键独立获得共享内存段来共享内存。相反,要使两个或多个进程通过这样的网段进行通信,它们必须都已从创建它的公共祖先进程(或成为的进程)继承了它。彼此之间没有这种关系的进程不能使用IPC_PRIVATE键来访问同一段。

  

除了别的ftok()和一些随机文件,我别无选择吗?我要为要创建的不同共享内存的每个块选择不同的文件吗?

由于您使用的是System-V共享内存,因此可以选择使用ftok()根据现有路径生成密钥,但不必是任意的

文件。您可以使用具有特定协作过程组特征的文件路径-输入文件,工作目录或类似文件。此外,ftok()还使用整数“项目ID”,通过它您可以区分不相关的运行,或用于不同目的或相似目的的多个不同键。如果您没有其他好的区分方法,则可以在此处选择某个指定进程的进程ID。

顺便说一下,请注意,System-V IPC接口非常笨拙。它们确实具有一些与众不同的功能,有时可能使它们更可取,但是较新的POSIX接口(shm_open()等)通常是更好的选择。 POSIX版本并不能为您提出的问题提供特别好的解决方案。