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/933850/

相关文章:

javascript - 令人难以置信的奇怪的 JavaScript 日期问题

linux - 指纹读取器 - ID 147e :2020 Upek - Thinkpad T430

c++ - QListWidget 在单击并拖动多个项目时导致段错误

c++ - 函数 try catch 语法和 main

c - 程序终止前的额外空行

c - strcasecmp 实现不打印

linux - 使用 sudo 作为另一个用户运行时的 Perl 系统调用

c++ - STL 数据结构的内存使用,Windows 与 Linux

c++ - 从 C++ 中的偏移量覆盖二进制文件的字节

c - 我是否转换 malloc 的结果?