Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux/*nix中运行的应用程序如何确定自己的绝对路径?_Linux_Path - Fatal编程技术网

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

Linux/*nix中运行的应用程序如何确定自己的绝对路径?,linux,path,Linux,Path,假设您通过键入“app”而不是其绝对路径来运行应用程序“app”。由于$PATH变量,实际运行的是/foo/bar/app。从应用程序内部,我想确定/foo/bar/app。argv[0]只是“应用程序”,因此没有帮助 我知道在Linux中我可以看到 /proc/self/exe softlink,但这在其他*nix上不起作用,特别是在OS X上。有没有更方便的方法来确定应用程序所在的目录?不要使用路径,使用/proc。这是我写的一些代码 const char* eif_ft__binary_f

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

我知道在Linux中我可以看到

/proc/self/exe


softlink,但这在其他*nix上不起作用,特别是在OS X上。有没有更方便的方法来确定应用程序所在的目录?

不要使用路径,使用/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\u STRING只是STRING类的一个通用宏。

我不确定是否有什么好的可移植方法可以做到这一点


在OS X上,您可以使用(如果愿意,可以对结果应用
realpath()

我最后模拟了“which”程序并查看$PATH中的每个dir,以查看$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();
  }

例如,在OSX上不起作用。我希望得到一个更通用的答案,但是如果没有,我会做类似上面的事情,谢谢。谢谢/proc/self…我没有意识到我不必使用getpid()来确定当前的进程,可以使用'self'来代替。我已经删除了我的getcwd()“答案”,我读得不够仔细,请原谅:)谢谢。这真的很有帮助,因为我还没有解决OSX。只有在有应用程序包的情况下,这才有效。我还没有找到获取命令行可执行文件路径的方法。但我想我还不够努力。啊,我想知道。这是一个命令行应用程序,不是一个应用程序包。在OS X 10.4上从shell运行的命令行应用程序适用于我(抱歉,我现在手头没有更新的东西)。。。