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

这是在ftok()手册中提到的

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

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

我很困惑const char *pathname

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

如何使用"/etc/hosts/""/etc/inittab"因为我确定所有这些系统都有这两个文件? 这是个好主意吗? 它可以导致任何问题?

我不想让用户在执行时input文件名,或者把文件名作为命令行参数。

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

谢谢你的时间。

那么,通常你会使用与应用程序本身相关的文件。

例如,我们有一个应用程序,它将配置文件加载到共享内存中(以经过分析的高效可访问的方式 – 将XML文件转换为带有快速指针的内存结构等等),然后创建共享内存来自配置文件本身的ftok段。

最糟糕的情况是,如果您的应用程序没有配置文件,请尝试使用可执行文件本身。 你可以肯定它存在于某个系统上(因为你正在运行它)。

你也没有限制文件,你可以使用/etc本身或/tmp甚至/如果你必须的。

我说“如果你必须”,因为这有点危险。 ftok调用将根据您的文件规格和您的ID给你一个唯一的密钥。 如果你使用你自己的文件,如/etc/andrew.conf ,你可以合理地确定你不会和任何其他的ftok -returned key发生冲突。

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

我一直在做的是使用文件规范作为我的应用程序的真正独特的价值,然后使用ID为我想创建的特定的东西。

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

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

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

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

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

只需将该char *传入该函数。