Linux / * nix中正在运行的应用程序如何确定自己的绝对路径?

时间:2010-05-08 16:02:39

标签: linux path

假设您通过键入“app”而不是其绝对路径来运行应用程序“app”。由于您的$ PATH变量,实际运行的是/ foo / bar / app。从内部应用程序我想确定/ foo / bar / app。 argv [0]只是'app',所以这没有帮助。

我知道在Linux中我可以看一下

的/ proc /自/ EXE

软链接,但这不适用于其他* nix,特别是OS X.是否有更便携的方式来确定应用程序所在的目录?

3 个答案:

答案 0 :(得分:3)

不要使用路径,使用/ proc。这是我写的一些代码

const char* eif_ft__binary_file()
{
#ifdef OS_WINDOWS
  wchar_t* p = (wchar_t*)malloc(282 * sizeof(wchar_t));
  GetModuleFileNameW(NULL, p, 280);
  char* res = transform__utf16_to_utf8(p,-1,NULL);
  free(p);
  return res;
#elif OS_LINUX
  char* path = (char*)malloc(512);
  int res = readlink("/proc/self/exe", path, 510);
  if (res == -1) { free(path); return ""; }
  path[res]=0;
  TEMP_STRING_1 = path;
  free(path);
  return TEMP_STRING_1.text();
#elif OS_SOLARIS
  char* path = (char*)malloc(512);
  int res = readlink("/proc/self/path/a.out", path, 510);
  if (res == -1) { free(path); return ""; }
  path[res]=0;
  TEMP_STRING_1 = path;
  free(path);
  return TEMP_STRING_1.text();
#elif OS_FREEBSD
  char* path = (char*)malloc(512);
  int res = readlink("/proc/curproc/file", path, 510);
  if (res == -1) { free(path); return ""; }
  path[res]=0;
  TEMP_STRING_1 = path;
  free(path);
  return TEMP_STRING_1.text();
#else
  TEMP_STRING_1 = "";
  return TEMP_STRING_1.text();
#endif
}

TEMP_STRING只是String类的通用宏。

答案 1 :(得分:1)

我不确定是否有任何好的便携方法可以做到这一点。

在OS X上,您可以使用_NSGetExecutablePath()(如果愿意,可以将realpath()应用于结果。)

答案 2 :(得分:0)

我最终模仿'which'程序并查看$ PATH中的每个目录,看看$ dir / app是否可执行:

if (strchr(progname, '/') == NULL) {
    std::string pathStr = getenv("PATH");
    std::string testDir;
    pathStr += ":";             // add a trailing ':' to make search easier
    size_t pos = 0;
    bool found = false;

    while (!found && ((pos = pathStr.find(":")) != std::string::npos)) {
      testDir = pathStr.substr(0, pos);
      testPath = testDir + "/" + progname;
      pathStr = pathStr.substr(pos + 1, pathStr.size() - pos + 1);
      if (access(testPath.c_str(), X_OK) == 0)
        found = true;
    }
    if (found)
      dir = testDir.c_str();
  }