You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS:通过编程获取卷中已使用inode数量的方法

获取卷已使用inode数(排除硬链接重复计数)的API方案

我完全理解你的需求——不想依赖df命令的输出,而是通过原生函数API来获取指定卷的已用inode数,而且要排除硬链接的重复计数。之前你尝试的ATTR_VOL_FILECOUNT确实会踩坑,因为它统计的是文件条目总数,每个硬链接都会被算成一个独立条目,但实际上硬链接共享同一个inode,不会额外消耗inode资源。

下面给你两个靠谱的解决方案,都是原生API,而且能准确得到你要的结果:

方案1:使用statfs系统调用

这是最直接的方式,df -i底层其实就是用这个调用获取inode数据的。statfs返回的结构体里包含了文件系统的总inode数和空闲inode数,两者相减就是已使用的唯一inode数(硬链接不会重复计数)。

代码示例(C语言)

#include <stdio.h>
#include <sys/param.h>
#include <sys/mount.h>
#include <string.h>

int main(int argc, char *argv[]) {
    struct statfs fs_info;
    // 替换成你要查询的卷挂载点,比如"/Volumes/MyDrive"
    const char *mount_point = "/";

    if (statfs(mount_point, &fs_info) == -1) {
        perror("statfs调用失败");
        return 1;
    }

    // 计算已使用inode数:总inode - 空闲inode
    unsigned long used_inodes = fs_info.f_files - fs_info.f_ffree;
    printf("指定卷已使用inode数: %lu\n", used_inodes);

    return 0;
}

方案2:使用getattrlist搭配正确的属性

如果你更倾向于用getattrlist,可以放弃ATTR_VOL_FILECOUNT,改用ATTR_VOL_INODECOUNT和ATTR_VOL_FREEINODECOUNT这两个属性,它们分别返回文件系统的总inode数和空闲inode数,相减后同样能得到准确结果。

代码示例(C语言)

#include <stdio.h>
#include <sys/attr.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[]) {
    const char *mount_point = "/"; // 替换为目标卷挂载点
    struct attrlist attr_list;
    // 定义缓冲区存储返回的属性值
    struct {
        uint64_t total_inodes;
        uint64_t free_inodes;
    } attr_buf;

    // 初始化属性列表,指定要获取的卷属性
    memset(&attr_list, 0, sizeof(attr_list));
    attr_list.bitmapcount = ATTR_BIT_MAP_COUNT;
    attr_list.volattr = ATTR_VOL_INODECOUNT | ATTR_VOL_FREEINODECOUNT;

    if (getattrlist(mount_point, &attr_list, &attr_buf, sizeof(attr_buf), FSOPT_NOFOLLOW) == -1) {
        perror("getattrlist调用失败");
        return 1;
    }

    unsigned long used_inodes = attr_buf.total_inodes - attr_buf.free_inodes;
    printf("指定卷已使用inode数: %lu\n", used_inodes);

    return 0;
}

补充说明

你之前用dtruss df的思路是对的,如果你再仔细看df -i的系统调用记录,会发现它确实调用了statfs(或者在某些系统上是getattrlist)来获取inode的总数和空闲数,而不是依赖ATTR_VOL_FILECOUNT。

这两个方案都能完美避开硬链接重复计数的问题,因为它们统计的是inode本身的数量,而不是文件条目数。

内容的提问来源于stack exchange,提问作者Zohar81

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:30:17