假设您通过键入“app”而不是其绝对路径来运行应用程序“app”。由于您的$ PATH变量,实际运行的是/ foo / bar / app。从内部应用程序我想确定/ foo / bar / app。 argv [0]只是'app',所以这没有帮助。
我知道在Linux中我可以看一下
的/ proc /自/ EXE
软链接,但这不适用于其他* nix,特别是OS X.是否有更便携的方式来确定应用程序所在的目录?
答案 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();
}