14

它在 ftok() 手册中提到

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

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

我很困惑const char *pathname

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

我如何使用"/etc/hosts/"或者"/etc/inittab"因为我确信所有这样的系统都会有这两个文件?这是个好主意吗?它会引起任何问题吗?

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

还有其他不同的更好的决定方式pathname吗?
哪种方式是最好和最可靠的?

谢谢你的时间。

4

4 回答 4

15

好吧,通常您会使用与应用程序本身关联的文件。

例如,我们有一个应用程序将配置文件加载到共享内存中(以一种经过解析的有效访问方式 - 考虑一个 XML 文件,该文件已转换为具有快速指针的内存结构等),我们创建了共享内存从ftok配置文件本身派生的段。

最坏的情况是,如果您的应用程序没有配置文件,请尝试使用可执行文件本身。您可以非常确定它存在于系统中的某个地方(因为您正在运行它)。

你也不限于文件,你可以使用/etc自己,/tmp或者即使/你必须。

我说“如果你必须”,因为它有点危险。该ftok调用将根据您的文件规范和 ID 为您提供唯一密钥。如果您使用自己的文件,例如/etc/andrew.conf,您可以合理地确定您不会与任何其他ftok返回的密钥发生冲突。

但是,如果您和其他所有人决定使用/tmp文件规范部分,那么唯一的区别就是 ID。因此,与其他键发生冲突要容易得多。

我一直在做的是将文件规范用作我的应用程序的真正唯一值,然后只将 ID 用于我想要创建的特定内容。

所以,如果我需要 27 个信号量和 15 个共享内存块,它们用作/etc/pax.conf文件规范和从 1 到 42 的 ID(我的应用程序知道什么 ID 与什么对象相关)。

于 2010-07-01T05:35:10.977 回答
3

最好的方法可能是使用其中一个可执行文件的 argv[0]。手册页说

The resulting value is the same for all pathnames that name the same file, ...

所以你应该是安全的,即使你的可执行文件有时是通过符号链接调用的。

于 2010-07-01T07:01:03.550 回答
1

您可以根据配置文件或命令行参数等为路径动态构建 char *。

只需将该 char * 传递给函数即可。

于 2010-07-01T05:35:36.250 回答
0

采用 ”。” 作为第一个参数。它将当前运行的目录发送到 ftok。

于 2018-03-27T07:55:06.510 回答