2009-11-06 38 views
2

我试图使用消息队列在Linux中两个不相关的进程之间的通信。我知道使用公共密钥值将允许我们在两个不相关的进程中打开相同的消息队列。但问题在于有时候某个系统实用程序可能已经使用了与消息队列相对应的关键值。所以我正在使用IPC_CREAT | IPC_EXEL标志确保强制创建新的消息队列。使用不相关的进程间消息队列

万一msgget()返回一个错误,我递增密钥值和重试来创建新的消息队列,直到成功为止。现在,问题是如何将这个成功的键值传递给想要在相同的消息队列上操作的其他不相关的进程。

我错过了什么吗?有没有人遇到过类似的问题?

回答

2

使用ftok(3)。它采用路径名和任意整数id(只使用较低的8位,因此通常使用一个字符)并生成一个可能唯一的key_t。不能保证是唯一的,但使用id可以使用相同的路径名,并且在发生碰撞时为id指定增量。

典型执行如下:

主要使用ftok(3)获取密钥。

主要使用标志来指定它希望新的消息队列。出错时,增加id并调用ftok,直到获得合适的消息队列。消息队列创建时具有特定于用户/组的权限,次级进程运行时的权限(尽可能窄,最好是进程独有的)

二级使用ftok获取启动密钥,然后使用msgget,递增id并重复使用ftok,直到它成功获取消息队列密钥。

1

IIRC,这正是该ftok(3)来解决这个问题。需要沟通的程序只需使用共同的路径和关键值。我们曾经通过命令行将FIFO的名称传递给我们的程序。他们会将此传递给ftok()以为我们的共享内存段生成密钥。

0

你可以简单地进入21世纪,并使用POSIX消息队列,而不是一个sysV的。 Posix队列有姓名而不是不明显的数字。在linux下,你可以挂载一个文件系统来查看它们,并用“rm”来删除它们。