从另一个目录(在linux下)启动一个c ++程序

时间:2016-08-18 15:37:56

标签: c++ linux

我正在尝试从另一个目录运行C ++应用程序(在Linux下)。该应用程序应该读取目录中的一些文件。让我们假设可执行文件在

/opt/app/proj/

应用程序要读取的所有文件都在同一目录中 如果我从这个目录运行代码,一切运行正常。但如果我在 / home / user中/文档/ 并执行代码

/opt/app/proj/application

它找不到文件!! 在我的C ++代码中,我添加了类似的内容:

string cwd(get_current_dir_name());
string path(argv[0]);
string CONFIG_FILE = "configuration.conf";
string FILETYPES  = "extensions.txt";

int pos = path.find("./");
if(pos>=0){
    path = cwd+path.substr(pos+1, path.length()-1);
}
pos     = path.find_last_of("/");
path    = path.substr(0,pos+1);
CONFIG_FILE = path + CONFIG_FILE;
FILETYPES   = path + FILETYPES;

它仍然无法运作.. 需要帮助......

4 个答案:

答案 0 :(得分:0)

在Linux上启动新流程大致分为两个步骤:

  1. fork()系统调用。

  2. 子进程执行exec()系统调用。

  3. 要从另一个目录启动新进程,只需让子进程chdir()到目录,然后再执行exec()系统调用。

    如果您使用的是system(),则可以将其替换为fork() + exec(),以执行此操作,或者从system()执行shell,以实际运行命令,你可以手动添加“chdir”命令,虽然这不太干净。

答案 1 :(得分:0)

如果您需要找到可执行文件的路径,只需阅读/proc/self/exe符号链接,然后您可以使用dirname()basename()来获取目录,然后{{1到那个位置并访问你的文件,就好像你已经在那里开始一样。

答案 2 :(得分:0)

要直接回答您的问题,Linux的工作目录是启动可执行文件的目录,而不是驻留的位置。正如其他人提到的,你可以使用readlink从/ proc / self / exe获取路径。然后,您可以使用完全限定的路径来查找其他感兴趣的文件。 Here是一些细节和示例。

一般来说,我不推荐这种方法。我经常使用的两种方法是:

  1. 始终从某个相对目录启动程序。例如,[variable path] / bin将是起点。使用可执行文件中的相对路径查找其他文件。日志,.. / conf目录的../log将包含配置文件等。如果可执行文件没有从正确的位置启动,那么它在尝试打开文件时会立即出错。这种方法的优点是使用相对路径,因此移动到新根很简单。
  2. 将配置文件作为命令行参数或env变量传递。配置文件将包含其他感兴趣文件的完整详细信息,而不引用可执行文件的相对起始位置。二进制文件从任何地方开始,配置文件包含所有细节。如果配置文件有一堆硬编码路径,那么当需要新的根时,这种方法可能会很麻烦。一个好的方法是定义一个ROOT变量,例如ROOT = / home / mfisher / project然后有相对于那个的其他路径,例如BIN = $ ROOT / bin中

答案 3 :(得分:-1)

非常感谢您的投入。实际上我的代码工作,只是我在上面的这个过程之前尝试从配置文件中读取。我的错。虽然,我试着看看你的命题,以便更好地了解C编​​程。 再次感谢!