我想在 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)而是直接系统调用。