利用statfs函数查看磁盘空间。
参考资料
发现给出的程序和系统的df命令的输出有点儿差异,看了busybox里面df命令的实现,发现df命令按1K做了四舍五入。
//2016-02-20
//
//计算指定路径下的已用空间和可用空间。
//
#include <sys/statfs.h>
#include <stdio.h>
#include <stdint.h>
//四舍五入并缩小1024
static unsigned long kscale(unsigned long b, unsigned long bs)
{
return (b * (unsigned long long)bs + 1024/2) / 1024;
}
int main(void)
{
struct statfs diskInfo;
statfs("/home/linux", &diskInfo);
unsigned long long blockSize = diskInfo.f_bsize; // 每个block里包含的字节数
unsigned long long totalSize = kscale(diskInfo.f_blocks, blockSize); // 总的字节数,f_blocks为block的数目
unsigned long long freeSize = kscale(diskInfo.f_bfree, blockSize); // 剩余空间的大小
unsigned long long availableSize = kscale(diskInfo.f_bavail, blockSize);// 可用空间大小
unsigned long long usedSize = totalSize - freeSize;
printf("freeSize = %lld KB = %lld MB = %lld GB\n",
freeSize, freeSize >> 10, freeSize >> 20);
printf("availableSize = %lld KB = %lld MB = %lld GB\n",
availableSize, availableSize >> 10, availableSize >> 20);
printf("%9s %9s %9s\n", "1K-blocks", "Used", "Available");
printf("%9lld %9lld %9lld\n", totalSize, usedSize, availableSize);
return 0;
}
和系统的df命令的输出是一样的。
~$ df /home/linux/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/disk/by-uuid/7dc8e796-8858-4212-acb3-a234a75fec97 114323040 66536748 41955892 62% /
~$ ./statfs
freeSize = 47786292 KB = 46666 MB = 45 GB
availableSize = 41955892 KB = 40972 MB = 40 GB
1K-blocks Used Available
114323040 66536748 41955892