在Linux

时间:2018-02-01 20:00:59

标签: c++ linux

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

我已尝试使用getcwd(),但这里有它的作用:

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

如果我只是做某事......

std::ifstream is("anotherfile");

只要我在同一个目录中,它就可以正常工作,但是当我没有时,它会像上面一样。

1 个答案:

答案 0 :(得分:3)

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

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

这是特定于Linux的,并且在罕见的病态情况下不起作用(您的可执行文件在执行期间被删除或重命名)。请参阅this

请记住,Linux没有文件夹(它们只是一个GUI工件),但是directories。另请参阅opendir(3)readdir(3)closedir(3)stat(2)nftw(3)等....

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

顺便说一下,如果设置了某个特定的环境变量(例如SqlException),你甚至可以采用SqlError的测试约定,如果设置了它,则将其用作配置文件。不要忘记文档这样的约定。