在 Linux 上获取程序的目录

Getting the program's directory on Linux

本文关键字:程序 获取 Linux      更新时间:2023-10-16

我想知道如何在Linux上获取我的程序目录。例如,如果我的程序位于/home/myproject/下并且我得到了目录,那么无论我从哪个目录调用程序,都应该/home/myproject/它。我需要此功能,因为我需要能够访问与我的程序位于同一文件夹下的配置文件,无论程序的文件夹位于何处。

我试过使用getcwd(),但这是它的作用:

如果我目前与程序位于同一文件夹中,它将起作用。但是,如果我在/root并尝试执行位于/home/myproject下的程序,它会给我/root

如果我只是做这样的事情...

std::ifstream is("anotherfile");

只要我在同一个目录中,它就可以工作,但是当我不在时,它的作用与上面相同。

在 Linux 上,您可以使用/proc/.仔细阅读 proc(5)。

我建议使用 readlink(2) 读取/proc/self/exe中的符号链接。它给你的可执行文件。你可以在它上面使用 dirname(3) 来获取它的目录。还要注意 realpath(3),它可能有用(实际上不是,因为正如 Daniel Schepler 所评论的那样,/proc/self/exe是一个规范路径......

这是特定于 Linux 的,在极少数病理情况下不起作用(您的可执行文件在执行过程中被删除或重命名)。看到这里。

请记住,Linux 没有文件夹(它们只是一个 GUI 工件),而是目录。参见 opendir(3)、readdir(3)、closedir(3)、stat(2)、nftw(3) 等。

最后,Unix的传统是将用户特定的配置文件保存在$HOME下(通常带有隐藏的点文件,例如$HOME/.inputrc) 和/etc/下的系统范围配置文件。你可以使用 getenv(3) 作为getenv("HOME")获得$HOME。参见环境(7)。在病理情况下,这种getenv可能会失败。

顺便说一句,如果设置了某些特定的环境变量,您甚至可以采用getenv测试约定(例如MYPROGCONFIG),如果已设置,请将其用作配置文件。不要忘记记录此类约定。