可能重复:
如何在C中查找可执行文件的位置
我希望一个可执行文件能够发现自己的路径; 我有一种感觉,答案是"你不能这样做",但我希望这一点得到确认!
我不认为我可以使用getcwd(),因为我可能不会从同一目录执行它.我不认为我可以使用argv[0],因为它基于用于执行它的字符串.还有其他选择吗?
合理
真正的问题是我想在文件系统上放置一个可执行文件,并在其旁边放置一个默认配置文件.我希望可执行文件能够在运行时读取其配置文件,但我不想将此位置硬编码到可执行文件中,也不希望用户必须设置环境变量.如果对这种情况有更好的解决方案,我全都耳朵......
Cer*_*lla 30
文件/ proc/self/exe是当前运行的可执行文件的simlink.
Aif*_*Aif 16
您可以使用getpid()来查找当前进程的pid,然后读取/proc/<pid>/cmdline(对于人类读者)或者/proc/<pid>/exe是实际程序的符号链接.然后,使用readlink(),您可以找到程序的完整路径.
这是C中的一个实现:
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <limits.h>
#include <stdio.h>
int main()
{
char path[PATH_MAX];
char dest[PATH_MAX];
memset(dest,0,sizeof(dest)); // readlink does not null terminate!
struct stat info;
pid_t pid = getpid();
sprintf(path, "/proc/%d/exe", pid);
if (readlink(path, dest, PATH_MAX) == -1)
perror("readlink");
else {
printf("%s\n", dest);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果你想尝试,你可以编译它,从可执行文件到另一个路径创建一个符号链接,并调用链接:
$ gcc -o mybin source.c
$ ln -s ./mybin /tmp/otherplace
$ /tmp/otherplace
/home/fser/mybin
Run Code Online (Sandbox Code Playgroud)