Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中获取二进制文件的目录_C_Posix - Fatal编程技术网

在C中获取二进制文件的目录

在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]

如何获得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];
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
的调用不起作用。@hyde
argv[0]
在这种情况下是不够的,因为我需要绝对路径。@hyde
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;
}