【问题标题】:How to get a program location in C [duplicate]如何在C中获取程序位置[重复]
【发布时间】:2013-07-18 22:10:30
【问题描述】:

你知道如何在 C 中获取当前程序的绝对位置吗?我说的不是当前目录,而是放置可执行文件的目录。

【问题讨论】:

  • 你是指放置可执行文件的目录吗?
  • 是的,我愿意。可执行路径也不错。
  • 哪个操作系统?
  • 我觉得这可能与操作系统有关,因为我认为 C 标准并没有强制要求程序必须从文件中运行
  • 如果他说的是 Windows,那就只复制一个

标签: c


【解决方案1】:

C 标准没有提供这样做的方法;它必须使用特定于操作系统的 API 来完成。您还不如在芯片上直接编程一个微型嵌入式操作系统;那么,程序的位置会是什么?

在普通操作系统上,我认为这可能是一个安全漏洞。

【讨论】:

  • 我不认为 C 标准说“你无法获得可执行文件的完整路径”。我建议将其重新表述为“这只能使用依赖于操作系统的 API”。至于“那么程序位置会是什么”:嵌入式系统通常只使用int main(void)
  • @H2CO3 谢谢,已更正。
【解决方案2】:

在 Linux 中使用 readlink /proc/self/exe

在 Windows 中使用 GetModuleFileName() 和说 hModule = NULL

【讨论】:

  • +1 显示实际解决方案比说“不可能”(显然不是)要好得多。
【解决方案3】:

据我所知,C 标准没有定义一种方法来做到这一点。唯一的方法是使用依赖于操作系统的函数,这意味着你在 Linux/Windows/Mac 中执行,而不是“在 C 中”。

一种方法是获取通常放在argv[0] 中的可执行文件的文件名。但我不确定假设它是可执行文件的完整路径是否总是安全的。

例如,在 BusyBox 中,他们使用符号链接使单个可执行文件显示为多个单独的程序。可执行文件检查argv[0] 是什么,并做出相应的行为。

【讨论】:

  • 不,它在执行时显示可执行文件(即,如果您执行了./a.out -foo bar,则argv[0]./a.out
【解决方案4】:

你可以看一下argv[0],但我不确定它是否能保证给你一个路径。

【讨论】:

  • @nouney 在 Windows 7 x86 上,它存储可执行文件的全名。自己试试。我有 MSVC2005。
  • @kvv 好吧,那我的错!
  • @nouney 我也不知道,所以没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2013-07-09
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
相关资源
最近更新 更多