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

Ope*_*ast 4 linux c usb system-calls usb-drive

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

Ser*_*nyy 6

对于挂载的 USB 闪存驱动器,您可以通过statvfs(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
Run Code Online (Sandbox Code Playgroud)

另请注意,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)系统调用反而。

  • 也许你应该提到 statvfs 它可以处理包含在 fs 中的任何文件,而不仅仅是挂载点——`statvfs("/dev/sda7", &amp;vfs)` 将返回关于 devtmpfs 文件系统的信息,而不是关于文件系统的信息包含在`/dev/sda7`中。 (2认同)