c - df 和 statfs 的输出不同

标签 c system-calls

为什么 df 命令的输出和 statfs() 系统调用值不同:

调用statfs的程序:

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/vfs.h>
#include <string.h>
#include <stdlib.h>


int main()
{
    struct statfs vfs;

    if (statfs("/", & vfs) != 0) {
        fprintf(stderr, "%s: statfs failed: %s\n",
            "/", strerror(errno));
        exit(0);
    }

    printf("mounted on %s:\n","/");

    printf("\tf_bsize: %ld\n", vfs.f_bsize);
    printf("\tf_blocks: %ld\n", vfs.f_blocks);
    printf("\tf_bfree: %ld\n", vfs.f_bfree);
    printf("\tf_bavail: %ld\n", vfs.f_bavail);
    printf("\tf_files: %ld\n", vfs.f_files);
    printf("\tf_ffree: %ld\n", vfs.f_ffree);

    return 0;
}

输出:

    mounted on /:
        f_bsize: 4096
        f_blocks: 119189762
        f_bfree: 112718672
        f_bavail: 106662506
        f_files: 30285824
        f_ffree: 29990111

df 命令的输出:

    ~$ df /
    Filesystem     1K-blocks     Used Available Use% Mounted on
    /dev/sda1      476759048 25882620 426651764   6% /

df 命令在内部调用 statfs 系统调用本身,但为什么结构值的输出与 df 命令的输出不同,谁能解释清楚。

最佳答案

df的数据可能是基于f_bavail,而不是f_bfree 所以对于总空间和可用空间的计算可能如下

long long Total_Space = vfs.f_blocks;
Total_Space *= vfs.f_frsize;
Total_Space /= 1024;
long long Avail_Space = vfs.f_bfree;
Avail_Space *= vfs.f_frsize;
Avail_Space /= 1024;

printf("Total Space=%lldKb Available Space=%lldKB\n",Total_Space,Avail_Space);

关于c - df 和 statfs 的输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21693673/

相关文章:

c - 如何使用 pthread 和 lpq 编译 C 代码

mysql - 如何将 mysql 指针转换为 unsigned long

Linux x64 : why does r10 come before r8 and r9 in syscalls?

sockets - 从 'struct sock'导出套接字fd

c - 在 fork() 之后打印子编号

c - 从 C 中的 fgetc() 获取字符

c - 如何在 Linux/Ubuntu 上安装/编译 SDL2 C 代码

macos - 为什么我的程序集中的系统调用错误检查无法工作?

c - getutent 和 Linux 计时器问题

c - execlp() 系统调用输出错误