我希望一个可执行文件能够发现自己的路径;我有一种感觉,答案是“你不能这样做”,但我希望这一点得到确认!
我认为我不能使用getcwd()
,因为我可能不会从同一目录执行它。我不认为我可以使用argv[0]
,因为它基于用于执行它的字符串。还有其他选择吗?
原理
真正的问题是我想在文件系统的某处放置一个可执行文件,并在其旁边放置一个默认的配置文件。我希望可执行文件能够在运行时读取其配置文件,但我不想将此位置硬编码到可执行文件中,也不希望用户必须设置环境变量。如果对这种情况有更好的解决方案,我会全力以赴......
答案 0 :(得分:30)
文件/ proc / self / exe是当前正在运行的可执行文件的符号链接。
答案 1 :(得分:14)
您可以使用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;
}
如果你想尝试,你可以编译它,从可执行文件到另一个路径创建一个符号链接,然后调用链接:
$ gcc -o mybin source.c
$ ln -s ./mybin /tmp/otherplace
$ /tmp/otherplace
/home/fser/mybin
答案 2 :(得分:5)
答案 3 :(得分:2)
嗯,你必须与getcwd()
结合使用argv[0]
。第一个为您提供工作目录,第二个为您提供工作目录(或绝对路径)中二进制文件的相对位置。
答案 4 :(得分:1)
从argv[0]
获取您的名字,然后呼叫which
命令。只有当您的可执行文件位于$PATH
时,才会执行此操作。