我应该传递哪个文件作为ftok()的路径名参数

时间:2010-07-01 05:30:14

标签: c linux queue ipc ftok

在ftok()手册中提到

key_t ftok(const char *pathname, int proj_id);

ftok()函数使用由给定路径名命名的文件的标识(必须引用现有的可访问文件) ...

我对const char *pathname感到困惑。

最佳做法是什么? 在我当前的系统上,我可以通过"/home/Andrew/anyfile",但我的程序必须运行的其他系统不可能拥有此文件。

我使用"/etc/hosts/""/etc/inittab"怎么样,因为我相信所有这些系统都会有这两个文件?这是个好主意吗?它会引起任何问题吗?

我不想让用户在执行时输入文件名或将文件名作为命令行参数传递。

还有其他不同且更好的方法来决定pathname吗?
哪种方式最好,最可靠?

感谢您的时间。

4 个答案:

答案 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。