用 C 确定 USB 闪存驱动器上的可用空间 (linux)

用 C 确定 USB 闪存驱动器上的可用空间 (linux)

我想在 Linux 中的 C 程序中找出 USB 闪存驱动器上的可用空间。我之前曾尝试过system("df -h /dev/sda1")解决这个问题,但在 Linux C 应用程序中使用系统命令会导致一些计时问题。因此需要知道如何使用任何其他类型的系统调用/库函数来确定可用的可用空间。

答案1

对于已安装的 USB 闪存驱动器,您可以通过以下方式执行此操作统计文件系统(3)函数,您需要提供挂载点的路径,并且您基本上有一个小版本df(顺便说一句,它也仅在挂载的文件系统上运行):

$ cat fs_usage.c 
#include <stdio.h>
#include <sys/statvfs.h>

int main(int argc, char **argv){

    struct statvfs fs_usage;
    statvfs(argv[1],&fs_usage);
    printf("%s:%f bytes available, %f bytes used\n",argv[1],
                fs_usage.f_frsize*(double)fs_usage.f_bavail,
                fs_usage.f_frsize * (double)(fs_usage.f_blocks - fs_usage.f_bfree));
    return 0;
}
$ gcc fs_usage.c -o fs_usage
$ df -B 1 /mnt/ubuntu
Filesystem        1B-blocks         Used  Available Use% Mounted on
/dev/sdb1      118013599744 105134329856 6860865536  94% /mnt/ubuntu
$ ./fs_usage /mnt/ubuntu/
/mnt/ubuntu/:6860865536.000000 bytes available, 105134329856.000000 bytes used

还要注意,statvfs()作为const char *path参数之一,它可以是文件系统内任何文件的路径名,例如/dev/sda7将返回/dev文件系统的使用情况(因为它实际上是虚拟文件系统之一),而不是sda7设备的分区。

请注意,我f_frsize在这里使用的,相当于f_bsize,但是在某些文件系统中,片段大小可能小于块大小。看https://unix.stackexchange.com/a/463370/85039详情


如果您的 C 库(通常是 glibc,但在嵌入式平台上可能是其他东西)以对您来说太慢的方式实现 statvfs(3),那么您可能应该使用底层statfs(2) 或 fstatfs(2)而是直接系统调用。

相关内容