美好的一天......
我正在做一个功课,说明我有5个过程;服务器,其余是客户端。 每个进程都应该来自不同的可执行文件。我将实现一个双向消息传递解决方案,但问题不在于消息传递本身。是否有一种优雅的方式来在这些不同的可执行文件之间传递 密钥 。即当我调用以下函数时:
int msgget(key_t key, int msgflg);
其他进程如何知道密钥?
我的作业可以使用预定的键,但我想知道如何在真实的程序中完成。因为“我理解”的是,如果一个不相关的进程在某个用户的机器上询问我的密钥,就会发生冲突。
答案 0 :(得分:10)
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,这将创建一个带有未使用密钥的队列并将句柄返回。