c++ - 如何在 C 中找到可执行文件的位置?

标签 c++ c linux unix path

<分区>

C/C++有没有办法找到当前执行程序的位置(完整路径)?

(argv[0] 的问题是它没有给出完整路径。)

最佳答案

总结:

  • 在带有 /proc 的 Unix 上,真正直接和可靠的方法是:

    • readlink("/proc/self/exe", buf, bufsize) (Linux)

    • readlink("/proc/curproc/file", buf, bufsize) (FreeBSD)

    • readlink("/proc/self/path/a.out", buf, bufsize) (Solaris)

  • 在没有 /proc 的 Unix 上(即如果上述失败):

    • 如果 argv[0] 以“/”开头(绝对路径)这就是路径。

    • 否则,如果 argv[0] 包含“/”(相对路径),则将其附加到 cwd (假设尚未更改)。

    • 否则在 $PATH 中搜索可执行文件 argv[0] 的目录。

    然后检查可执行文件是否实际上不是符号链接(symbolic link)可能是合理的。 如果它是相对于符号链接(symbolic link)目录解析的。

    此步骤在/proc 方法中不是必需的(至少对于 Linux)。 proc 符号链接(symbolic link)直接指向可执行文件。

    请注意,是否正确设置 argv[0] 取决于调用进程。 大多数情况下这是正确的,但有时调用进程不可信任(例如 setuid 可执行文件)。

  • 在 Windows 上:使用 GetModuleFileName(NULL, buf, bufsize)

关于c++ - 如何在 C 中找到可执行文件的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52096980/

相关文章:

c - 求 0 到 125 之间的数的立方根

linux - 在每一行的 .csv 文件中更改日期格式

linux - 在 Red Hat 64 位上安装 xampp

无法将字符串分配给 C 中的扑克牌程序的单个字符变量

c - C中结构数组的静态初始化

c++ - VS 2012 MFC 对话框中缺少 WM_WINDOWPOSCHANGING

c++ - 假设数组为 'bool' ,那么 'a[n] == (-1)' 可以为真吗?

linux - Linux与window远程连接

c++ - 奇怪的宏扩展

c++ - SAFESEH 图像 C++ 的模块不安全