你可以使用popen(3):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *f;
char info[256];
f = popen("/usr/sbin/diskutil info /", "r");
if (f == NULL) {
perror("Failed to run diskutil");
exit(0);
}
while (fgets(info, sizeof(info), f) != NULL) {
printf("%s", info);
}
pclose(f);
return 0;
}
编辑
抱歉,我没有仔细阅读问题。您也可以使用Disk Arbitration Framework。还有一些示例代码可能会有所帮助 (FSMegaInfo)。
更新
我查看了otool -L $(which diskutil) 的输出,似乎它使用了一个名为DiskManagement.framework 的私有框架。查看class-dump 的输出后,我看到有一个volumeFreeSpaceForDisk:error: 方法。所以我从diskutil -info / 和FSMegaInfo FSGetVolumeInfo / 和我的工具得到的尺寸是:
diskutil:427031642112 Bytes
我的工具:volumeFreeSpaceForDisk: 427031642112
FSMegaInfo:freeBytes = 427031642112 (397 GB)
我还观察到,每次运行其中一个工具时,大小都会不同(几 KB),而且 diskutil 除以 1000,FSMegaInfo 除以 1024,因此以 GB 为单位的大小将是总是不同(与 df -h 和 df -H 和 diskutil 的原因相同 - 基数为 10 和基数为 2)。
这是我的示例工具:
#import <Foundation/Foundation.h>
#import "DiskManagement.h"
#import <DiskArbitration/DADisk.h>
int main(int argc, char *argv[])
{
int err;
const char * bsdName = "disk0s2";
DASessionRef session;
DADiskRef disk;
CFDictionaryRef descDict;
session = NULL;
disk = NULL;
descDict = NULL;
if (err == 0) {session = DASessionCreate(NULL); if (session == NULL) {err = EINVAL;}}
if (err == 0) {disk = DADiskCreateFromBSDName(NULL, session, bsdName); if (disk == NULL) {err = EINVAL;}}
if (err == 0) {descDict = DADiskCopyDescription(disk); if (descDict == NULL) {err = EINVAL;}}
DMManager *dmMan = [DMManager sharedManager];
NSLog(@"blockSizeForDisk: %@", [dmMan blockSizeForDisk:disk error:nil]);
NSLog(@"totalSizeForDisk: %@", [dmMan totalSizeForDisk:disk error:nil]);
NSLog(@"volumeTotalSizeForDisk: %@", [dmMan volumeTotalSizeForDisk:disk error:nil]);
NSLog(@"volumeFreeSpaceForDisk: %@", [dmMan volumeFreeSpaceForDisk:disk error:nil]);
return 0;
}
您可以通过运行class-dump /System/Library/PrivateFrameworks/DiskManagement.framework/Versions/Current/DiskManagement > DiskManagement.h 来获取DiskManagement.h,并且可以通过使用-F/System/Library/PrivateFrameworks/ 包含私有框架路径并添加-framework 来链接到该框架。
编译:
clang -g tool.m -F/System/Library/PrivateFrameworks/ -framework Foundation -framework DiskArbitration -framework DiskManagement -o tool
更新 2:
你也可以看看here和here。如果FSMegaInfo 示例不适合您,那么您可以只使用stat /Volumes/.MobileBackups 并从您从statfs("/", &stats) 获得的大小中减去它的大小。