2

我制作了一个 Linux CUI 应用程序,它通过消息队列在进程之间进行通信。

只要是单例就没有问题。但是,当同一个应用程序有多个实例时,队列中的消息会被发送到错误的实例。

我知道这可以通过给 msgget 函数一个唯一的键来避免。使用 ftok() 创建密钥,但由于变量相同,它们会产生相同的密钥。

有人可以指导我如何为每个实例设置一个唯一的密钥吗?

我现在唯一的想法是随机分配给 ftok 的变量,我知道这不可能。

4

4 回答 4

2

您可以尝试使用进程ID。我的 google foo 得到了这个

于 2009-03-17T06:00:04.927 回答
2

小心ftok!

这仅对于给定的文件系统是唯一的,并且仅当文件系统未被大量使用时才唯一。fttok 由文件系统中的文件条目号驱动。

这曾经是获得独特价值的好方法,但几年前时间和摩尔定律赶上了它。它适用于文件编号的低 8 位,但实际文件编号现在是 32 位,并且每个文件系统重新开始编号。

进程 ID 是一个不错的选择,它们确实会被重新循环,但只要进程还活着就不会。

于 2009-03-17T06:12:04.803 回答
0

查找全局唯一 ID,通常称为 Guid 或 Uuid。必须有一个可以用来生成它们的库。它们是由您的网卡地址、当前时间和随机数组成的唯一字符串。

于 2009-03-17T06:16:36.227 回答
0

时钟呢? 维基百科说它比 RDTSC(和 SMP 安全)更好。

CLOCK_MONOTONIC“在 Linux 下,通过使用 POSIX clock_gettime 函数读取时钟的值来提供类似的功能。”

于 2009-07-02T07:56:10.877 回答