如何以编程方式检索OS X board-id信息

时间:2016-07-29 18:50:12

标签: c++ macos awk iokit sysinfo

如何在c ++中以编程方式检索以下信息:

这是Mac OSX中的终端命令:

ioreg -c IOPlatformExpertDevice | awk '/board-id/ {print $4}' | awk -F '\"' '{print $2}'

我使用IOKit库来检索IOPlatformSerialNumber和PlatformUUID信息等信息。但我找不到任何相应的“board-id”键。

1 个答案:

答案 0 :(得分:2)

如果您的C ++代码中有io_service_t IOPlatformExpertDevice句柄,则可以使用IORegistryEntryCreateCFProperty()函数获取“board-id”属性。期望接收CFData对象,但检查null和正确的类型ID以确定。然后,使用通常的CFData方法以您想要的形式提取数据。

如果你还没有得到IOService句柄,你应该能够使用IOServiceGetMatchingService()到达那里(我希望可以安全地假设只有一个IOPlatformExpertDevice实例。) ,或使用IORegistryGetRootEntry()获取根,并将IORegistry图表移至IORegistryEntryGetChildEntry()或类似的平台专家设备。

由于board-id属性没有命名符号常量,因此您只需对其进行硬编码:

CFTypeRef board_id_property = IORegistryEntryCreateCFProperty(
  platform_expert_device, CFSTR("board-id"), kCFAllocatorDefault, 0);

请注意,属性值可以采用不同的类型,包括CFNumberCFBooleanCFStringCFDataCFArrayCFDictionary,并且您需要准备好处理类型与您期望的类型不匹配的情况,或者返回NULL时(如果该属性不存在)。使用CFGetTypeID()检查类型,例如:

if (board_id_property != NULL && CFGetTypeID(board_id_property) == CFDataGetTypeID())
{
    CFDataRef board_id_data = (CFDataRef)board_id_property;
    // safe to use CFData* functions now
    ...

    CFRelease(board_id_property);
}
else
{
    // Unexpected, do error handling.
    ...

    if (board_id_property != NULL)
        CFRelease(board_id_property);
}