Ope*_*ast 4 linux c usb system-calls usb-drive
我想在 Linux 中的 C 程序中找出 USB 闪存驱动器上的可用空间。我之前曾经system("df -h /dev/sda1")想过,但是在 Linux C 应用程序中使用系统命令会导致一些计时问题。因此需要知道如何使用任何其他类型的系统调用/库函数来确定可用空间。
对于挂载的 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)系统调用反而。