我如何在C中找到可执行文件的位置?

这个问题在这里已经有了答案:

  • 在没有/ proc / self / exe的情况下查找当前可执行文件的路径12个答案

  • 总结:

  • 在使用/proc Unix上,真正直接和可行的方法是:

  • readlink("/proc/self/exe", buf, bufsize) (Linux)

  • readlink("/proc/curproc/file", buf, bufsize) (FreeBSD)

  • readlink("/proc/self/path/a.out", buf, bufsize) (Solaris)

  • 在没有/proc Unix上(即如果以上失败):

  • 如果argv [0]以“/”(绝对路径)开头,则为路径。

  • 否则,如果argv [0]包含“/”(相对路径),则将其追加到cwd(假设它尚未更改)。

  • 否则,在$PATH搜索可执行文件argv[0]

  • 之后,检查可执行文件是否实际上不是符号链接可能是合理的。 如果它解决了它相对于symlink目录。

    这个步骤在/ proc方法中是不必要的(至少对于Linux来说)。 那里的proc符号链接直接指向可执行文件。

    请注意,它由调用进程正确设置argv[0] 。 这是正确的大多数时候,但有时,调用过程不可信(例如setuid可执行文件)。

  • 在Windows上:使用GetModuleFileName(NULL, buf, bufsize)


  • 如果您使用的是Windows,请使用GetModuleFileName()函数。


    请注意,以下评论仅限unix。

    对这个问题的迂回回答是,在所有情况下都没有正确回答这个问题的一般方法。 正如你发现的那样,argv [0]可以由父进程设置为任何东西,因此不需要与程序的实际名称或其在文件系统中的位置无关。

    但是,以下启发式经常起作用:

  • 如果argv [0]是绝对路径,则假定这是可执行文件的完整路径。
  • 如果argv [0]是相对路径,即它包含/ ,则使用getcwd()确定当前工作目录,然后向其附加argv [0]。
  • 如果argv [0]是一个纯字,请搜索$ PATH寻找argv [0],并将argv [0]追加到您找到它的任何目录中。
  • 请注意,所有这些都可以通过调用相关程序的过程来绕过。 最后,您可以使用特定于linux的技术,例如emg-2中提到的技术。 其他操作系统上可能有相同的技术。

    即使假设上面的步骤给你一个有效的路径名,你仍然可能没有你真正想要的路径名(因为我怀疑你实际上想要做的是找到某个配置文件)。 硬链接的存在意味着您可以有以下情况:

    -- assume /app/bin/foo is the actual program
    $ mkdir /some/where/else
    $ ln /app/bin/foo /some/where/else/foo     # create a hard link to foo
    $ /some/where/else/foo
    

    现在,上面的方法(包括,我怀疑,/ proc / $ pid / exe)会将/some/where/else/foo作为程序的真正路径。 而且,实际上,这是该计划的真正途径,而不是你想要的。 请注意,在实践中比硬链接更常见的符号链接不会出现此问题。

    尽管这种方法原则上不可靠,但在大多数情况下,它在实践中运作良好。

    链接地址: http://www.djcxy.com/p/54701.html

    上一篇: How do I find the location of the executable in C?

    下一篇: Change directory to the directory of a Python script