我正在尝试使用消息队列在Linux中两个不相关的进程之间进行通信。我知道使用公共密钥值将允许我们在两个不相关的进程中打开相同的消息队列。但问题是有时系统实用程序可能已经使用了与消息队列对应的键值。所以我使用IPC_CREAT | IPC_EXEL标志以确保强制创建新的消息队列。
如果msgget()返回错误,我会递增键值并重试以创建新的消息队列,直到成功为止。现在,问题是我如何将这个成功的密钥值传递给想要在同一个消息队列上运行的其他不相关的进程。
我错过了什么吗?以前有人遇到过类似的问题吗?
答案 0 :(得分:2)
使用ftok(3)。它需要一个路径名和一个任意整数id(仅使用低8位,因此通常使用一个字符)并生成一个可能唯一的key_t。它不能保证是唯一的,但使用id可以使用相同的路径名,并且如果发生冲突,则为id指定增量。
典型的执行是:
主要使用ftok(3)获取密钥。
主要使用标志来指定它想要一个新的消息队列。出错时,增加id并调用ftok,直到获得合适的消息队列。创建消息队列时使用特定于辅助进程运行的用户/组的权限(尽可能窄,最好是进程唯一)
Secondary使用ftok获取起始键,然后使用msgget,递增id并重新使用预先确定的ftok,直到它成功获取消息队列密钥。
答案 1 :(得分:1)
ftok(3)
用来解决的问题。需要通信的程序只使用公共路径和键值。我们曾经在命令行上将FIFO的名称传递给我们的程序。他们会将此传递给ftok()
以生成共享内存段的密钥。
答案 2 :(得分:0)
你可以简单地进入21世纪并使用Posix消息队列而不是sysV消息队列。 Posix队列具有名称而不是模糊的数字。在linux下你可以挂载一个文件系统来查看它们并用“rm”删除它们。