io_iterator_t drives = IO_OBJECT_NULL;
mach_port_t masterPort = IO_OBJECT_NULL;
IOMasterPort(bootstrap_port, &masterPort);
IOServiceGetMatchingServices(masterPort, IOServiceMatching(kIOBlockStorageDriverClass), &drives);
io_registry_entry_t drive = 0;
uint64_t totalBytesRead = 0;
uint64_t totalBytesWritten = 0;
while ((drive = IOIteratorNext(drives)))
{
io_name_t drivePath;
IORegistryEntryGetPath(drive, kIOServicePlane, drivePath);
NSLog(@"Path:%s", drivePath);
NSNumber* statVal = 0;
NSDictionary* statistics;
statistics = (NSDictionary*)IORegistryEntryCreateCFProperty(drive, CFSTR(kIOBlockStorageDriverStatisticsKey), kCFAllocatorDefault, kNilOptions);
if (statistics)
{
statVal = (NSNumber*)[statistics objectForKey:(NSString*)CFSTR(kIOBlockStorageDriverStatisticsBytesReadKey)];
totalBytesRead += [statVal intValue];
statVal = (NSNumber*)[statistics objectForKey:(NSString*)CFSTR(kIOBlockStorageDriverStatisticsBytesWrittenKey)];
totalBytesWritten += [statVal intValue];
}
[statistics release];
IOObjectRelease(drive);
}
IOIteratorReset(drives);
readRate = (double)(totalBytesRead - prevReadVal)/1024;
writeRate = (double)(totalBytesWritten - prevWriteVal)/1024;
prevReadVal = totalBytesRead;
prevWriteVal = totalBytesWritten;
起動後にブート ドライブで読み書きされた合計バイト数を取得しようとしています。ただし、上記のコードは機能しないようです。少し調査したところ、行:statistics = (NSDictionary*)IORegistryEntryCreateCFProperty(drive, CFSTR(kIOBlockStorageDriverStatisticsKey), kCFAllocatorDefault, kNilOptions);
が機能していないことがわかりました。有効なオブジェクトを返す代わりに、関数は null を返すようです。誰かが理由を知っていますか?包括的な Google 検索では結果が得られませんでした。
私は、Objective C を使用して OSX 用のアプリを構築している Mountain Lion OS X を使用していることに注意してください。