繁体   English   中英

Linux上正在运行的程序的目录?

[英]Directory of running program on Linux?

嘿,我一直在写一个程序(一种类似于电子书的查看类东西),它从可执行文件所在的文件夹中的一个文件夹中加载文本文件。 这给我带来了一个问题,因为例如,如果我使用“ ./folder/folder/program”命令从另一个目录运行该程序,由于工作目录不正确,我的程序将找不到文本。 我没有绝对目录,因为我希望该程序具有可移植性。 有什么方法可以获取可执行文件正在运行的确切目录,即使它是从其他目录运行的也是如此。 我听说可以将argc [0]和getcwd()组合在一起,但是当目录中有空格时,argc被截断了(我想呢?),所以我想避免这种情况。

我预先在Linux上使用g ++,Thanx

编辑-不要使用getcwd(),它只是用户所在的位置,而不是可执行文件所在的位置。

有关详细信息,请参见此处

在Linux上,/ proc / <pid> / exe或/ proc / self / exe应该是指向可执行文件的符号链接。 与其他人一样,我认为更重要的问题是“为什么需要这个?” 使用可执行路径查找辅助文件并不是真正的UNIX形式。 而是使用环境变量或默认位置,或遵循其他约定之一来查找辅助文件的位置(即〜/。<myapp> rc)。

将图书添加到图书馆后,您可以记住其绝对路径。
当程序依赖于将从工作目录而不是从其他目录启动的事实时,这还不错。 这就是为什么存在带有“工作目录”参数的各种“链接”的原因。

您不必以自己想要的方式处理此类情况。 只需检查所有必要的文件和目录结构是否到位,如果没有,则记录说明错误。

或者,每当您的程序启动且找不到所需文件时,该程序就会要求将路径指向“图书库”。

我仍然看不到知道您当前目录名称的原因。

#include <boost/filesystem/convenience.hpp>

#include <iostream>
#include <ostream>

int main(int argc, char** argv)
{
    boost::filesystem::path argvPath( argv[0] );
    boost::filesystem::path executablePath( argvPath.parent_path() );
    boost::filesystem::path runPath( boost::filesystem::initial_path() );

    std::cout << executablePath << std::endl;
    std::cout << runPath << std::endl;
    return 0;
}

您可以通过阅读命令行来获取正在运行的程序的路径。 在Linux中,您可以通过将/ proc文件夹读为/ proc / PID / CommandLine来获取命令行

有空格时, argv[0]不会被截断。 但是,当从PATH环境变量中列出的目录运行程序时,它将仅具有程序名称,而没有路径。

无论如何,您在此处尝试做的并不是针对Unix / Linux程序的良好设计。 数据文件未与程序文件存储在同一目录中,因为这样做会使应用适当的安全策略变得困难。

在我看来,获得所需内容的最佳方法是使用Shell脚本启动实际程序。 这与Firefox在Linux系统上启动的方式非常相似。 Shell将脚本的名称放入$0并且此变量将始终具有路径。 然后,您可以使用环境变量或命令行参数为程序提供数据文件的位置,如下所示:

dir=`dirname "$0"`
cd "$dir/../data/"
"$dir/real-program"

我会安排您的程序,使其文件如下所示:

install-dir/bin/program
install-dir/bin/real-program
install-dir/etc/config
install-dir/data/book-file.mobi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM