在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]
将是该符号链接,而不是调用可执行文件的最终路径。如果愚蠢的应用程序使用exec()
调用并忘记正确初始化argv,argv[0]
也可能会误导,我曾经遇到过这种情况。)
execl("/home/hacker/.hidden/malicious", "/bin/ls", "-s", (char *)0);
- 'argv[0]' 的值是"/bin/ls"
,但这与可执行文件的名称无关。 - Jonathan Leffler