在Linux上,应用程序可以通过查询轻松获取其绝对路径/proc/self/exe
。在 FreeBSD 上,它更加复杂,因为您必须构建 sysctl 调用:
int mib[4];
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PATHNAME;
mib[3] = -1;
char buf[1024];
size_t cb = sizeof(buf);
sysctl(mib, 4, buf, &cb, NULL, 0);
但这仍然是完全可行的。但我无法找到一种方法来确定 OS X 上命令行应用程序的这一点。如果您从应用程序包中运行,则可以通过运行来确定它[[NSBundle mainBundle] bundlePath]
,但由于命令行应用程序不在捆绑包中,因此这没有帮助。
(注:咨询argv[0]
不是一个合理的答案,因为如果从符号链接启动,argv[0]
将是该符号链接,而不是所调用的可执行文件的最终路径。argv[0]
如果愚蠢的应用程序使用exec()
调用并忘记正确初始化 argv,这是我在野外看到的。)
功能_NSGetExecutablePath将返回可执行文件的完整路径(无论是否为 GUI)。该路径可能包含符号链接,“..
”等,但是realpath如果需要,可以使用函数来清理它们。看man 3 dyld了解更多信息。
char path[1024];
uint32_t size = sizeof(path);
if (_NSGetExecutablePath(path, &size) == 0)
printf("executable path is %s\n", path);
else
printf("buffer too small; need size %u\n", size);
这个函数的秘密在于,Darwin 内核在执行完之后立即将可执行路径放入进程堆栈中。envp
创建进程时的数组。动态链接编辑器dyld
在初始化时获取它并保留指向它的指针。该函数使用该指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)