在ftok()手册中提到
key_t ftok(const char *pathname, int proj_id);
ftok()函数使用由给定路径名命名的文件的标识(必须引用现有的可访问文件) ...
我对const char *pathname
感到困惑。
最佳做法是什么?
在我当前的系统上,我可以通过"/home/Andrew/anyfile"
,但我的程序必须运行的其他系统不可能拥有此文件。
我使用"/etc/hosts/"
或"/etc/inittab"
怎么样,因为我相信所有这些系统都会有这两个文件?这是个好主意吗?它会引起任何问题吗?
我不想让用户在执行时输入文件名或将文件名作为命令行参数传递。
还有其他不同且更好的方法来决定pathname
吗?
哪种方式最好,最可靠?
感谢您的时间。
答案 0 :(得分:14)
通常,您会使用与应用程序本身关联的文件。
例如,我们有一个应用程序将配置文件加载到共享内存中(以解析的高效可访问的方式 - 想到一个XML文件已经变成具有快速指针的内存结构等等)我们创建了来自配置文件本身的ftok
的共享内存段。
最坏的情况是,如果您的应用程序没有配置文件,请尝试使用可执行文件本身。您可以非常肯定它存在于系统某处(因为您正在运行它)。
您也不仅限于文件,如果必须,您可以使用/etc
本身或/tmp
甚至/
。
我说“如果你必须”,因为它有点危险。 ftok
来电将根据您的文件规范和您的ID为您提供唯一的密钥。如果您使用自己的文件,例如/etc/andrew.conf
,则可以合理地确定您不会与任何其他ftok
- 返回的密钥发生冲突。
但是,如果您和其他所有人决定使用/tmp
作为文件规范部分,则唯一的区别是ID。因此,与其他密钥发生冲突要容易得多。
我一直在做的是将文件规范用作我的应用程序的真正唯一值,然后只使用我想要创建的特定内容的ID。
所以,如果我需要27个信号量和15个共享内存块,他们所有使用/etc/pax.conf
作为文件规范,ID从1到42(我的应用程序知道什么ID与什么对象有关。)
答案 1 :(得分:3)
最好的方法是使用其中一个可执行文件的argv [0]。手册页说
The resulting value is the same for all pathnames that name the same file, ...
因此,即使您的可执行文件有时通过符号链接调用,也应该是安全的。
答案 2 :(得分:1)
您可以根据配置文件或命令行参数等为路径动态构建char *。
将char *传递给函数。
答案 3 :(得分:0)
使用“。”作为第一个参数。它会将当前运行的目录发送到ftok。