我想知道如何在Linux上获取程序目录。例如,如果我的程序位于/home/myproject/
下并且我获得了目录,那么无论我从哪个目录调用该程序,它都应该是/home/myproject/
。我需要此功能,因为我需要能够访问位于与我的程序相同的文件夹下的配置文件,无论程序的文件夹位于何处。
我已尝试使用getcwd()
,但这里有它的作用:
如果我当前与该程序位于同一个文件夹中,它将起作用。但是,如果我在/root
并尝试执行位于/home/myproject
下的程序,则会给我/root
。
如果我只是做某事......
std::ifstream is("anotherfile");
只要我在同一个目录中,它就可以正常工作,但是当我没有时,它会像上面一样。
答案 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
的测试约定,如果设置了它,则将其用作配置文件。不要忘记文档这样的约定。