【问题标题】:C++ Get Application Directory *NIXC++ 获取应用程序目录 *NIX
【发布时间】:2011-06-30 10:14:49
【问题描述】:

如何在 Linux/Unix 上获取 C++ 中的应用程序目录。 getcwd() 返回运行应用程序的目录,但我想要构建所在的实际目录。

我知道您可以从 main() 获得此信息,但我真的无法访问它,并且有人告诉我您不能依赖它(这是真的吗?)。

【问题讨论】:

  • 确实,argv[0] 的值并不能保证。可以使用execv 调用您的二进制文件并更改argv[0] 的值。不要依赖它,尤其是对于涉及安全问题的任何事情。
  • @ereOn - 没有任何可能:)
  • 至少有 2 人似乎同意 ;)

标签: c++ linux unix directory cwd


【解决方案1】:

argv[0] 将为您提供可执行文件的完整路径 - 不知道这是否是通用标准

【讨论】:

  • argv[0] 应为指向 NTMBS 的初始字符的指针,该字符表示用于调用程序的名称或 ""(第 3.6.1 节),所以它应该取决于程序是如何被调用的;根据我的经验,这往往非常依赖于实现,通常你不能相信它。
  • 是的,IIRC 如果我 ln -s a b; ./bargv[0] 将是 b 而不是 a,即使 b 只是一个符号链接。
【解决方案2】:
【解决方案3】:

一般来说,在 unix 系统中,您甚至不能假设存在仍然指向可执行文件的文件或目录。例如,文件/目录可能在程序运行时被删除(这在 windows 中是不可能的,但在 unix/linux 中不是问题)。另一方面,可能有 多个 名称指向同一个物理文件(硬链接),其中没有一个是主要文件……在这种情况下,文件的“名称”是什么?

没有安全的可移植方式来获取程序的名称,因为可能有很多名称或根本没有指向该程序的名称。如果您必须找到程序的名称,则意味着您正在尝试做错事,并且可能有更好的解决方案。

编辑:

虽然没有适用于所有 *x 系统的通用可移植方法,但在 linux 下,您可以使用名称 /proc/self/exe 打开可执行文件。即使文件不再被任何目录指向(例如,即使文件在运行时已被“删除”),这也将起作用。如果进程仍在运行,则运行进程的实际文件(inode)将始终可用,可能缺少文件名(即指向该 inode 的目录列表)。

【讨论】:

  • +1 表示“你试图做错事”:在 Windows 上,人们倾向于将程序的资源放在同一个目录中,但在 *NIX 上,几乎总是有更好的位置,具体取决于关于资源类型(/etc/usr/share 等)
  • @ereOn 我正在尝试将资源放入程序中,我正在 PS2linux 上制作游戏,将资源(音乐、模型、纹理等)与二进制文件一起使用似乎很明智.
  • 如果你需要打开实际的可执行文件那么有/proc/self/exe可以在linux下使用。正在运行的进程的文件(inode)将始终可用......它的名称(即目录列表)可能不存在。
猜你喜欢
  • 2011-07-28
  • 1970-01-01
  • 2015-01-23
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2011-06-11
相关资源
最近更新 更多