如何在 C++ 中以编程方式检索以下信息:
这是 Mac OSX 中的终端命令:
ioreg -c IOPlatformExpertDevice | awk '/board-id/ {print $4}' | awk -F '\"' '{print $2}'
我使用 IOKit 库来检索 IOPlatformSerialNumber 和 PlatformUUID 信息等信息。但我找不到“board-id”的任何对应键。
如果您在 C++ 代码中有io_service_t
句柄,则可以使用该函数获取“board-id”属性。期望接收一个对象,但检查 null 和正确的类型 id 以确保。然后,使用通常的方法以您想要的形式提取数据。IOPlatformExpertDevice
IORegistryEntryCreateCFProperty()
CFData
CFData
如果您还没有 IOService 句柄,您应该可以使用其中任何一种IOServiceGetMatchingService()
(我希望假设只有一个IOPlatformExpertDevice
实例是安全的。),或者使用IORegistryGetRootEntry()
获取根,并遍历 IORegistry 图到具有IORegistryEntryGetChildEntry()
或类似的平台专家设备。
由于该board-id
属性没有命名符号常量,您只需对其进行硬编码:
CFTypeRef board_id_property = IORegistryEntryCreateCFProperty(
platform_expert_device, CFSTR("board-id"), kCFAllocatorDefault, 0);
请注意,属性值可以采用不同的类型,包括CFNumber
、CFBoolean
、CFString
、CFData
、CFArray
和CFDictionary
,并且您需要准备好处理类型与您期望的类型不匹配或返回 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);
}