我制作了一个 Linux CUI 应用程序,它通过消息队列在进程之间进行通信。
只要是单例就没有问题。但是,当同一个应用程序有多个实例时,队列中的消息会被发送到错误的实例。
我知道这可以通过给 msgget 函数一个唯一的键来避免。使用 ftok() 创建密钥,但由于变量相同,它们会产生相同的密钥。
有人可以指导我如何为每个实例设置一个唯一的密钥吗?
我现在唯一的想法是随机分配给 ftok 的变量,我知道这不可能。
我制作了一个 Linux CUI 应用程序,它通过消息队列在进程之间进行通信。
只要是单例就没有问题。但是,当同一个应用程序有多个实例时,队列中的消息会被发送到错误的实例。
我知道这可以通过给 msgget 函数一个唯一的键来避免。使用 ftok() 创建密钥,但由于变量相同,它们会产生相同的密钥。
有人可以指导我如何为每个实例设置一个唯一的密钥吗?
我现在唯一的想法是随机分配给 ftok 的变量,我知道这不可能。
您可以尝试使用进程ID。我的 google foo 得到了这个
小心ftok!
这仅对于给定的文件系统是唯一的,并且仅当文件系统未被大量使用时才唯一。fttok 由文件系统中的文件条目号驱动。
这曾经是获得独特价值的好方法,但几年前时间和摩尔定律赶上了它。它适用于文件编号的低 8 位,但实际文件编号现在是 32 位,并且每个文件系统重新开始编号。
进程 ID 是一个不错的选择,它们确实会被重新循环,但只要进程还活着就不会。
查找全局唯一 ID,通常称为 Guid 或 Uuid。必须有一个可以用来生成它们的库。它们是由您的网卡地址、当前时间和随机数组成的唯一字符串。
时钟呢? 维基百科说它比 RDTSC(和 SMP 安全)更好。
CLOCK_MONOTONIC
“在 Linux 下,通过使用 POSIX clock_gettime 函数读取时钟的值来提供类似的功能。”