gpt4 book ai didi

c - 以编程方式检索 OS X 命令行应用程序的绝对路径

转载 作者:太空狗 更新时间:2023-10-29 16:27:14 25 4
gpt4 key购买 nike

在 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] 不是一个合理的答案,因为如果从符号链接(symbolic link)启动,argv[0] 将是那个符号链接(symbolic link)——而不是调用的可执行文件的最终路径。argv[0] 也可能是一个愚蠢的应用程序使用 exec() 调用而忘记正确初始化 argv 的情况,我已经看到了在野外。)

最佳答案

函数_NSGetExecutablePath将返回可执行文件的完整路径(GUI 与否)。该路径可能包含符号链接(symbolic link)、“..”等,但 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 在初始化时获取它并保留指向它的指针。此函数使用该指针。

关于c - 以编程方式检索 OS X 命令行应用程序的绝对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/799679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com