在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.
启动程序时包含
我得出的结论是,编译后的可执行文件没有可移植的方法来获取其目录的路径。显而易见的替代方法是将环境变量传递给可执行文件,告诉它它所在的位置。
如何获取当前正在执行的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.
我得出的结论是,编译后的可执行文件没有可移植的方法来获取其目录的路径。显而易见的替代方法是将环境变量传递给可执行文件,告诉它它所在的位置。