可执行文件可以发现自己的路径吗? (Linux)的

时间:2010-10-26 15:44:55

标签: c linux

  

可能重复:
  how to find the location of the executable in C

我希望一个可执行文件能够发现自己的路径;我有一种感觉,答案是“你不能这样做”,但我希望这一点得到确认!

我认为我不能使用getcwd(),因为我可能不会从同一目录执行它。我不认为我可以使用argv[0],因为它基于用于执行它的字符串。还有其他选择吗?

原理

真正的问题是我想在文件系统的某处放置一个可执行文件,并在其旁边放置一个默认的配置文件。我希望可执行文件能够在运行时读取其配置文件,但我不想将此位置硬编码到可执行文件中,也不希望用户必须设置环境变量。如果对这种情况有更好的解决方案,我会全力以赴......

5 个答案:

答案 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)

使用proc filesystem

您的流程将是:

  • 获取pid可执行文件
  • 查看/proc/PID/exe的符号链接

答案 3 :(得分:2)

嗯,你必须与getcwd()结合使用argv[0]。第一个为您提供工作目录,第二个为您提供工作目录(或绝对路径)中二进制文件的相对位置。

答案 4 :(得分:1)

argv[0]获取您的名字,然后呼叫which命令。只有当您的可执行文件位于$PATH时,才会执行此操作。