在C中获取二进制目录

Getting directory of binary in C

如何获取当前正在执行的C命令所在目录的绝对路径?我正在寻找类似于 shell 脚本中的命令 dirname "$(readlink -f "[=10=]")" 的内容。例如,如果 C 二进制文件是 /home/august/foo/bar 并且执行为 foo/bar 我想得到结果 /home/august/foo.

也许尝试 POSIX realpath()argv[0];类似下面的东西 (在我的机器上工作):

#include <limits.h> /* PATH_MAX */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
    char buf[PATH_MAX];
    char *res = realpath(argv[0], buf);
    (void)argc;                      /* make compiler happy */
    if (res) {
        printf("Binary is at %s.\n", buf);
    } else {
        perror("realpath");
        exit(EXIT_FAILURE);
    }
    return 0;
}

argv[0] 和 Linux 上的 realpath(3) 的一种替代方法是使用 /proc/self/exe,它是指向可执行文件的符号 link。您可以使用 readlink(2) 从中获取路径名。有关详细信息,请参阅 proc(5)

顺便说一下,

argv[0] 可以是 NULL(尽管这在实践中通常不会发生)。它也不保证包含用于 运行 命令的路径,尽管它会在从 shell.

启动程序时包含

我得出的结论是,编译后的可执行文件没有可移植的方法来获取其目录的路径。显而易见的替代方法是将环境变量传递给可执行文件,告诉它它所在的位置。