Linux上运行程序的目录?

时间:2009-04-10 15:31:36

标签: c++ linux unix

嘿,我一直在编写一个程序(一种电子书查看类型的东西),它从可执行文件所在的文件夹中的文件夹中加载文本文件。这给我带来了一些问题,因为如果我使用命令“./folder/folder/program”从另一个目录运行程序,我的程序将找不到文本,因为工作目录不正确。我不能拥有绝对目录,因为我希望程序是可移植的。有没有办法获得运行可执行文件的精确目录,即使它已从另一个目录运行。我听说可以组合argc [0]和getcwd()但是当目录中有空格时argc会被截断,(我想?)所以我想尽可能避免这种情况。

我在Linux上使用g ++,Thanx提前

4 个答案:

答案 0 :(得分:8)

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

请参阅here for details

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

答案 1 :(得分:2)

当您向图书馆添加图书时,您可以记住它的绝对路径 当你的程序依赖于它将从工作目录而不是从其他目录发起的事实时,这并不是一件坏事。这就是为什么有各种各样的“链接”与“工作目录”参数。

您无需按照自己的方式处理此类情况。只需检查所有必要的文件和目录结构是否到位,如果不是,请记录错误。

或者每当您的程序启动并且找不到必要的文件时,程序可以要求指向书库的路径。

我仍然没有理由知道您当前的目录名称。

#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;
}

答案 2 :(得分:0)

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

来获取命令行

答案 3 :(得分:0)

当有空格时,

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