Linux 使用DF源码进行获取挂载路径的磁盘使用情况

由于通过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");
	
	

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值