如何在Linux中选择进程间通信的“关键字”?

4

你好...

我正在做一份作业,其中要求我有5个进程;一个是服务器,其余的是客户端。每个进程都应该从不同的可执行文件中启动。我将实现一种双向消息传递的解决方案,但问题并不在于消息传递本身。是否有一种优雅的方法来在这些不同的可执行文件之间通信密钥。也就是说,当我调用以下函数时:

int msgget(key_t key, int msgflg);

其他进程如何知道密钥?

在我的作业中使用预定的密钥是可以的,但我想知道如何在真正的程序中实现。因为我理解的是,如果一个不相关的进程在某个用户的计算机上请求我的密钥,可能会发生冲突。

3个回答

11

有一个惯例是使用ftok()生成唯一的密钥,来自man

ftok()函数使用给定路径名所命名的文件的身份(必须引用现有的可访问文件)和proj_id的最低有效8位(必须为非零值)来生成key_t类型的System V IPC键,适用于msgget(2)、semget(2)或shmget(2)。

当使用相同的proj_id值时,所有命名同一文件的路径名的结果值都相同。当同时存在的文件或项目ID不同时,返回值应该不同。


谢谢。不好意思,如果我理解答案有误,但是我该如何在可执行文件之间共享“生成的密钥”呢?也就是说,在服务器上获取密钥后,我该如何将其传达给客户端之一? - Khaled Alshaya
2
通过在客户端使用相同的参数运行ftok。 - hobbs
如果我正确理解了描述,它说必须存在该路径中的文件,因此预定的随机“长”字符串不是一个选项。 - Khaled Alshaya

1
据我所知,您通常会为程序生成一个伪随机密钥,并将其嵌入其中。有2^32个可能的密钥,因此碰撞的几率非常小。
如果您需要保证不发生意外碰撞,通常会使用命名管道而不是消息传递。

这就是为什么我会想到,实际上可能我假设碰撞会发生,而事实上在实践中并没有发生。如果没有其他的解决方案提出,我会选择这个答案 :) - Khaled Alshaya

1

对于“全局”资源,我赞同jspcal的ftok()答案,他比我早一步得到了这个答案 :)

如果您有一堆相关进程(即父进程和一堆子进程),它们应该共享一个队列,则应使用IPC_PRIVATE调用msgget,它将创建具有未使用密钥的队列并返回其句柄。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接