macOS:以编程方式获取卷中使用的inode数量

时间:2018-04-12 07:29:44

标签: c macos filesystems system-calls

我希望使用函数API获取指定卷的已使用inode数,而不是使用df shell命令的输出。

我查看了getattrlist的手册页并找到了以下属性,但它也可能引用了硬链接,但它们指的是现有的inode,我不想不止一次地统计它们。

ATTR_VOL_FILECOUNT        A u_int32_t containing the number of files on the volume.

我还尝试运行dtruss df并搜索确切的sys调用,该调用会检索此值,但我无法将其放在上面:

csops(0x872, 0x7, 0x7FFEEE4C8E80)        = 0 0
sysctl([CTL_KERN, 14, 1, 2162, 0, 0] (4), 0x7FFEEE4C8FC8, 0x7FFEEE4C8FC0, 0x0, 0x0)      = 0 0
csops(0x872, 0x7, 0x7FFEEE4C8770)        = 0 0
getfsstat64(0x0, 0x0, 0x2)       = 6 0
getfsstat64(0x7FFD41001600, 0x3B48, 0x2)         = 6 0
getfsstat64(0x7FFD41001600, 0x3B48, 0x1)         = 6 0
getrlimit(0x1008, 0x7FFEEE4C9EC0, 0x0)       = 0 0
fstat64(0x1, 0x7FFEEE4C9ED8, 0x0)        = 0 0
ioctl(0x1, 0x4004667A, 0x7FFEEE4C9F24)       = 0 0  

此处的df输出(请注意iused字段)

Filesystem    512-blocks      Used Available Capacity iused               ifree %iused  Mounted on
/dev/disk1s1   976695384 757288824 211770792    79% 2000778 9223372036852775029    0%   /

我可以在哪里找到df的源代码或其他API来完成此任务。

谢谢

1 个答案:

答案 0 :(得分:1)

我想我找到了the source,它就是这样做的:

if (iflag) {
        inodes = sfsp->f_files;
        used = inodes - sfsp->f_ffree;
        (void)printf(" %*llu %*llu %4.0f%% ", mwp->iused, used,
            mwp->ifree, sfsp->f_ffree, inodes == 0 ? 100.0 :
            (double)used / (double)inodes * 100.0);

其中sfsp是指向struct statfs实例的指针,来自statfs(),就像您期望的那样。