代码之家  ›  专栏  ›  技术社区  ›  Oliver Charlesworth

可执行文件能否发现自己的路径?(Linux)[副本]

  •  17
  • Oliver Charlesworth  · 技术社区  · 14 年前

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

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

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

    理论基础

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

    5 回复  |  直到 8 年前
        1
  •  30
  •   Petr Macek    14 年前

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

        2
  •  14
  •   Mark Lakata    8 年前

    可以使用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
    
        3
  •  5
  •   NG.    14 年前

    使用 proc filesystem

    你的流程是:

    • 获取可执行文件的PID
    • /proc/PID/exe 对于一个链接
        4
  •  2
  •   Å imon Tóth    14 年前

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

        5
  •  1
  •   Gaius    14 年前

    从中获取您的姓名 argv[0] 然后呼叫 which 命令。只有当可执行文件位于 $PATH .