我希望使用函数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来完成此任务。
谢谢
答案 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()
,就像您期望的那样。