由于通过df 命令获取的数据还需要gerp 来筛选同时还需要解析,觉得麻烦还耗时;
找到了busybox的df 命令源码直接调用更加方便;
#include <sys/statvfs.h>
unsigned long long ByteToKB(unsigned long long val, unsigned long block_size, unsigned long display_unit)
{
if (val == 0)
return 0;
if (block_size > 1)
val *= block_size;
if (display_unit) {
val += display_unit/2; /* Deal with rounding */
val /= display_unit; /* Don't combine with the line above! */
/* will just print it as ulonglong (below) */
}
return val;
}
注:此路径是挂载的路径
void ShowDiskInfo(char* path)
{
unsigned long df_disp_hr = 1024;
struct statvfs s;
if (statvfs(path, &s) == 0) {
/* Some uclibc versions were seen to lose f_frsize
* (kernel does return it, but then uclibc does not copy it)
*/
if (s.f_frsize == 0)
s.f_frsize = s.f_bsize;
//计算使用率
unsigned long long blocks_used;
unsigned long long blocks_total;
unsigned blocks_percent_used;
blocks_used = s.f_blocks - s.f_bfree;
blocks_total = blocks_used + s.f_bavail;
blocks_percent_used = blocks_total; /* 0% if blocks_total == 0, else... */
if (blocks_total != 0) {
/* Downscale sizes for narrower division */
unsigned u;
while (blocks_total >= INT_MAX / 101) {
blocks_total >>= 1;
blocks_used >>= 1;
}
u = (unsigned)blocks_used * 100u + (unsigned)blocks_total / 2;
blocks_percent_used = u / (unsigned)blocks_total;
}
unsigned long long Size = ByteToKB(s.f_blocks, s.f_frsize, df_disp_hr);
unsigned long long Used = ByteToKB((s.f_blocks - s.f_bfree),s.f_frsize, df_disp_hr);
unsigned long long Avail = ByteToKB(s.f_bavail, s.f_frsize, df_disp_hr);
printf(" 总大小Size =%llu 已经使用的大小Used =%llu 普通用户可用的大小=%llu 已经使用的百分比=%d %\n",
Size ,Used ,Avail ,blocks_percent_used);
}
}
void main()
{
//显示根目录的使用情况
ShowDiskInfo("/");
//显示共享内存的使用情况
ShowDiskInfo("/dev/shm");
}

被折叠的 条评论
为什么被折叠?



