如何为Linux中的进程间通信选择“密钥”?

时间:2010-01-15 00:09:31

标签: linux ipc message-passing

美好的一天......

我正在做一个功课,说明我有5个过程;服务器,其余是客户端。 每个进程都应该来自不同的可执行文件。我将实现一个双向消息传递解决方案,但问题不在于消息传递本身。是否有一种优雅的方式来在这些不同的可执行文件之间传递 密钥 。即当我调用以下函数时:

int msgget(key_t key, int msgflg);

其他进程如何知道密钥?

我的作业可以使用预定的键,但我想知道如何在真实的程序中完成。因为“我理解”的是,如果一个不相关的进程在某个用户的机器上询问我的密钥,就会发生冲突。

3 个答案:

答案 0 :(得分:10)

一项惯例是使用ftok()man

生成唯一键
  

ftok()函数使用标识   由给定的文件命名的文件   pathname(必须引用   现有的,可访问的文件)和   最重要的8位proj_id   (必须非零)生成一个   key_t类型System V IPC密钥,适合   用于msgget(2),semget(2)或   shmget的(2)。

     

结果值相同   所有命名同一文件的路径名,   当proj_id的值相同时   用过的。返回的值应该是   不同的时候(同时   现有的)文件或项目ID   不同。

答案 1 :(得分:1)

AFAIK,您通常会为您的程序生成一个伪随机密钥,并将其嵌入其中。有2 ^ 32个可能的键,因此碰撞的可能性相当小。

如果您需要保证不会发生意外冲突,您通常会使用命名管道而不是消息传递。

答案 2 :(得分:1)

对于“全球”资源,我支持jspcal的ftok()答案,他在我之前得到的答案是:)

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