在C中获取二进制文件的目录
如何获得C中当前正在执行的命令的目录的绝对路径?我在shell脚本中寻找类似于命令在C中获取二进制文件的目录,c,posix,C,Posix,如何获得C中当前正在执行的命令的目录的绝对路径?我在shell脚本中寻找类似于命令dirname“$(readlink-f“$0”)”的东西。例如,如果C二进制文件是/home/august/foo/bar,它作为foo/bar执行,我想得到结果/home/august/foo,可以尝试使用argv[0];类似以下内容(在我的机器上工作): \include/*PATH\u MAX*/ #包括 #包括 int main(int argc,字符**argv){ char buf[PATH_MAX]
dirname“$(readlink-f“$0”)”
的东西。例如,如果C二进制文件是/home/august/foo/bar
,它作为foo/bar
执行,我想得到结果/home/august/foo
,可以尝试使用argv[0]
;类似以下内容(在我的机器上工作):
\include/*PATH\u MAX*/
#包括
#包括
int main(int argc,字符**argv){
char buf[PATH_MAX];
char*res=realpath(argv[0],buf);
(void)argc;/*使编译器高兴*/
如果(res){
printf(“二进制文件位于%s.\n”,buf);
}否则{
perror(“realpath”);
退出(退出失败);
}
返回0;
}
可以尝试使用argv[0]
;类似以下内容(在我的机器上工作):
\include/*PATH\u MAX*/
#包括
#包括
int main(int argc,字符**argv){
char buf[PATH_MAX];
char*res=realpath(argv[0],buf);
(void)argc;/*使编译器高兴*/
如果(res){
printf(“二进制文件位于%s.\n”,buf);
}否则{
perror(“realpath”);
退出(退出失败);
}
返回0;
}
Linux上的argv[0]
和realpath(3)
的一种替代方法是使用/proc/self/exe
,这是指向可执行文件的符号链接。您可以使用readlink(2)
从中获取路径名。有关更多信息,请参见proc(5)
顺便说一下,
argv[0]
允许为NULL
(尽管在实践中通常不会发生这种情况)。它也不能保证包含用于运行命令的路径,尽管从shell启动程序时会包含该路径。Linux上的argv[0]
和realpath(3)
的一个替代方法是使用/proc/self/exe
,这是指向可执行文件的符号链接。您可以使用readlink(2)
从中获取路径名。有关更多信息,请参见proc(5)
顺便说一下,
argv[0]
允许为NULL
(尽管在实践中通常不会发生这种情况)。它也不能保证包含用于运行该命令的路径,尽管从shell启动程序时会包含该路径。我得出的结论是,没有可移植的方法可以让CommPicked可执行文件获得指向其目录的路径。显然,另一种方法是将环境变量传递给可执行文件,告诉它它的位置。我得出的结论是,对于一个可执行文件来说,没有可移植的方法来获取其目录的路径。显然,另一种方法是将环境变量传递给可执行文件,告知其位置。感谢您的解决方案,尽管您的示例打印的是二进制文件的路径,而不是其目录。使用libgen.h
中的函数dirname
可以解决此问题。根据常量PATH_MAX
中的文档说明字符串终止符,因此,不严格需要+1。与readlink-f
不同,如果二进制文件是通过PATH
变量执行的,则对realpath
的调用不起作用。感谢您的解决方案,尽管您的示例打印的是二进制文件的路径而不是其目录。使用libgen.h
中的函数dirname
可以解决此问题。根据常量PATH_MAX
中的文档说明字符串终止符,因此+1不是严格需要的。与readlink-f
不同,如果二进制文件是通过PATH
变量执行的,那么对realpath
的调用不起作用。@hydeargv[0]
在这种情况下是不够的,因为我需要绝对路径。@hydeargv[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;
}