如何获取c ++文件的当前工作目录

时间:2017-11-05 14:39:31

标签: c++

我使用以下代码获取C ++文件的当前工作目录

//Getting current working directory
getcwd( wd, 1024 );
std::string cwd = wd;

如果从另一个函数调用此文件中的函数,则当前工作目录将成为调用函数的路径。

如何获取原始文件/二进制文件所在位置的当前目录?

我正在添加细节,因为问题很混乱。

我创建了一个从Scilab调用的.so文件。如果我使用readlink(),我得到的路径为/usr/bin/scilab-bin,这不是我想要的。如何获取so文件的路径,当前函数在?

2 个答案:

答案 0 :(得分:0)

这个问题几乎与How to check what shared libraries are loaded at run time for a given process?重复。您需要的信息只能从/ proc文件系统获得,告诉您在您的过程中哪些文件已动态映射到内存中。

答案 1 :(得分:0)

您在评论中提到.so个文件,因此我假设您的目标是GNU / Linux。您可以使用dladdr1函数获取包含地址的.so文件的路径名,如下所示:

#include <string>
#include <vector>

#include <dlfcn.h>
#include <libgen.h>
#include <link.h>
#include <string.h>

static std::string
get_path ()
{
  Dl_info info;
  void *extra_info;
  if (dladdr1 (reinterpret_cast <void *> (&get_path),
               &info, &extra_info, RTLD_DL_LINKMAP) == 0)
    // Some form of error handling.
    return "";
  link_map *lm = static_cast<link_map *> (extra_info);
  // Make a copy of l_name because dirname modifies its argument.
  std::vector<char> buffer (lm->l_name, lm->l_name + strlen (lm->l_name) + 1);
  return dirname (buffer.data ());
}

dladdr1的第一个参数是非常随意的,但最好不要使用从DSO导出的符号,因为它最终可能引用不同对象中的某些内容(由于PLT存根和复制重定位)