9

我正在使用ftok()为 C 应用程序使用的共享内存段生成标识符。我遇到了问题,在一个盒子上我与 root 使用的标识符发生冲突。在这种情况下,我可以通过破解代码来修复它,但我想要一个更强大的解决方案。

应用程序安装到它自己的逻辑卷中,提供给 ftok 的路径是应用程序的二进制目录(在该 lv 内)。提供的 ID 从 1 开始,通常有六个左右。

我已经追踪到 ftok 会做这样的事情:

(id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff)

st.st_dev / st.st_ino 的组合应该是非常独特的。但是我在许多盒子中看到,st_dev 的最低有效位通常为 0(即 st_dev 数字通常是 256 的倍数)。而且由于二进制目录位于逻辑卷中,因此无法保证 inode 编号与 root 使用的编号不同。

有没有解决这个问题的好方法 - 一个更好的 ftok 替代方案,或者一种设置机器的方法,以便 st_dev 数字对 ftok 更有用?

4

2 回答 2

8

您可能要考虑使用 POSIX 共享内存(通过shm_open),它不会遭受这种密钥冲突

于 2011-09-07T12:07:29.483 回答
1

您的应用程序应该始终能够处理键冲突。另一个不相关的进程可能正在使用一个密钥。但是您可以尝试使用更多相关位创建您自己的 ftok() 版本。

理论上,任何应用程序都只需要一个“主”键,指向可以找到其他键的“记分牌”。在文件系统上公开主密钥可能是个好主意。崩溃后重新启动将始终是一个问题。

于 2011-09-07T11:40:38.533 回答