我正在尝试从另一个目录运行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;
它仍然无法运作.. 需要帮助......
答案 0 :(得分:0)
在Linux上启动新流程大致分为两个步骤:
fork()
系统调用。
子进程执行exec()
系统调用。
要从另一个目录启动新进程,只需让子进程chdir()
到目录,然后再执行exec()
系统调用。
如果您使用的是system()
,则可以将其替换为fork()
+ exec()
,以执行此操作,或者从system()
执行shell,以实际运行命令,你可以手动添加“chdir”命令,虽然这不太干净。
答案 1 :(得分:0)
如果您需要找到可执行文件的路径,只需阅读/proc/self/exe
符号链接,然后您可以使用dirname()
或basename()
来获取目录,然后{{1到那个位置并访问你的文件,就好像你已经在那里开始一样。
答案 2 :(得分:0)
要直接回答您的问题,Linux的工作目录是启动可执行文件的目录,而不是驻留的位置。正如其他人提到的,你可以使用readlink从/ proc / self / exe获取路径。然后,您可以使用完全限定的路径来查找其他感兴趣的文件。 Here是一些细节和示例。
一般来说,我不推荐这种方法。我经常使用的两种方法是:
答案 3 :(得分:-1)
非常感谢您的投入。实际上我的代码工作,只是我在上面的这个过程之前尝试从配置文件中读取。我的错。虽然,我试着看看你的命题,以便更好地了解C编程。 再次感谢!