如何在 macOS 的 C/C++ 中获取产品名称/版本(即获取“Mac OS”和“10.12.5”)

lel*_*ntt 4 c macos operating-system version

我需要获取标题中的信息。我对以下变量进行了 sysctl 调用,它给了我其他(无用)信息(通常与内核而不是操作系统有关):KERN_VERSION、KERN_OSVERSION、KERN_TYPE、KERN_RELEASE。

我在这里查看了该命令的源代码sw_vershttps://opensource.apple.com/source/DarwinTools/DarwinTools-1/sw_vers.c并尝试实现他们所做的事情,但是当我能够包含我的计算机时却无法找到,因此我无法实施。当我查看 /include/ 目录时,我根本找不到 /CoreFoundation/ 所以我不知道从哪里提取它。

关于如何使用 C/C++ 实现此目的有什么想法吗?

谢谢

jxh*_*jxh 5

如果这是我的项目,我只需调用该sw_vers实用程序并解析其输出。您可以使用popen它来完成此操作,如下图所示:

char buf[1024];
unsigned buflen = 0;
char line[256];
FILE *sw_vers = popen("sw_vers", "r");
while (fgets(line, sizeof(line), sw_vers) != NULL) {
    int l = snprintf(buf + buflen, sizeof(buf) - buflen, "%s", line);
    buflen += l;
    assert(buflen < sizeof(buf));
}
pclose(sw_vers);
Run Code Online (Sandbox Code Playgroud)

解析输出以获取相关信息。在我的系统上,输出是:

ProductName:    Mac OS X
ProductVersion: 10.12.5
BuildVersion:   16F73
Run Code Online (Sandbox Code Playgroud)

因此,您可以解析每一行,而不是将其全部存储到缓冲区中,如图所示。

一旦信息存储在程序中,结果就可以被缓存。同一程序将来的任何查询都可以使用缓存的结果,而不用sw_vers再次调用。