代码之家  ›  专栏  ›  技术社区  ›  Andrew-Dufresne

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

  •  9
  • Andrew-Dufresne  · 技术社区  · 16 年前

    在ftok()手册中提到

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

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

    我很困惑 const char *pathname .

    最佳实践是什么? 在我目前的系统中,我可以通过 "/home/Andrew/anyfile" 但我的程序必须运行的其他系统不可能有这个文件。

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

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

    还有别的更好的方法来决定吗 pathname ?
    哪条路是最好和最可靠的?

    谢谢你的时间。

    4 回复  |  直到 8 年前
        1
  •  14
  •   paxdiablo    14 年前

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

    例如,我们有一个应用程序将一个配置文件加载到共享内存中(以一种高效可访问的解析方式——想想一个XML文件,它已经转换为具有快速指针等的内存结构),然后我们从 ftok 从配置文件本身派生。

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

    你也不局限于文件,你可以使用 /etc 本身或 /tmp 甚至 / 如果必须的话。

    我说“如果你必须的话”,因为这有点危险。这个 FTOK 调用将根据您的文件规范和ID为您提供一个唯一的密钥。 拥有 文件如 /etc/andrew.conf 你可以合理地确定你不会与其他人发生冲突。 FTOK -返回键。

    但是,如果你和其他人决定使用 /TMP 作为文件规范的一部分,唯一的区别是ID。因此,与其他键冲突要容易得多。

    我一直在做的就是使用文件规范作为我的应用程序的一个真正独特的值,然后只使用我想要创建的特定事物的ID。

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

        2
  •  3
  •   Jens Gustedt    16 年前

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

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

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

        3
  •  1
  •   John Weldon user3678248    16 年前

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

    只需将char*传递到函数中。

        4
  •  0
  •   Progster219    8 年前

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

    推荐文章