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

Oli*_*rth 20 c linux

可能重复:
如何在C中查找可执行文件的位置

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

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

合理

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

Cer*_*lla 30

文件/ proc/self/exe是当前运行的可执行文件的simlink.

  • 应该使用readlink读取此符号链接. (9认同)
  • 这里有一个 readlink 实现:/sf/ask/386796791/ (2认同)

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)

  • 正如在@ Cercerilla的回答中所指出的那样,`/ proc/self/exe`就像`/ proc/<PID>/exe`一样,你不需要找到自己的pid. (4认同)
  • 没错,我最近一直在使用`self`! (3认同)

NG.*_*NG. 5

使用proc文件系统

你的流程将是:

  • 得到可执行的pid
  • 看一下/proc/PID/exe符号链接

  • 没有必要获得pid并动态操作字符串.硬编码字符串`"/ proc/self/exe"`更简单,更好. (5认同)