Linux 使用statvfs读取文件系统信息
本文转载自:https://blog.csdn.net/papiping/article/details/6980573
在测试过程中,f_bfree的值比f_frsize的值大于10%的尺寸大小,意味着16G的磁盘
f_bfree测试出来的结果是17G,f_frsize测试的结果是15G
struct statvfs {
unsigned long f_bsize; /* file system block size */文件系统块大小
unsigned long f_frsize; /* fragment size */碎片大小
fsblkcnt_t f_blocks; /* size of fs in f_frsize units */
fsblkcnt_t f_bfree; /* # free blocks */空闲的块
fsblkcnt_t f_bavail; /* # free blocks for unprivileged users */用户级的空闲节点
fsfilcnt_t f_files; /* # inodes */节点
fsfilcnt_t f_ffree; /* # free inodes */空闲的节点
fsfilcnt_t f_favail; /* # free inodes for unprivileged users */用户级的空闲节点
unsigned long f_fsid; /* file system ID */
unsigned long f_flag; /* mount flags */
unsigned long f_namemax; /* maximum filename length */
};
测试环境:ext4
1)分析f_bsize和f_frsize的异同
表示每块包含字节的多少
打印结果都是4096字节,显然都是一样的
2)分析f_bfree和f_bavail
表示磁盘剩余空闲的容量
打印结果是
磁盘为16G的情况下,f_bfree比f_bavail大809MB
磁盘为1.5T的情况下,f_bfree比f_bavail大2585MB
并没有我们想象的成线性增长
实际情况下采用df -Th
f_bavail更加接近显示的值
3)f_blocks表示磁盘的整体空间
4)计算磁盘各个方面的数值如下:
磁盘的整体空间:(buf.f_blocks * buf.f_frsize)/1024/1024)MB
磁盘的空闲空间:(buf.f_bfree * buf.f_frsize)/1024/1024)MB
磁盘的用户级空闲空间:(buf.f_bavail * buf.f_frsize)/1024/1024)MB
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<mntent.h>
#include<sys/statvfs.h>
//pszDevicePath是设备的文件描述符,pszDeviceMountPoint是设备的挂载点
intGetDeviceMountPoint(constchar*pszDevicePath,char*pszDeviceMountPoint)
{
structmntent*pent;
FILE*pFile;
pFile=setmntent("/proc/mounts","r");
if(pFile==NULL){
perror("setmntent");
return-1;
}
while(NULL!=(pent=getmntent(pFile)))
{
if(strcmp(pent->mnt_fsname,pszDevicePath)==0)
{
sprintf(pszDeviceMountPoint,"%s",pent->mnt_dir);
printf("Device:%smountpointis:%s\n",pszDevicePath,pszDeviceMountPoint);
}
}
endmntent(pFile);
return0;
}
//通过statvfs查询挂载点上文件系统的空间大小
intGetDeviceRoomSize(constchar*pszDeviceMountPoint)
{
structstatvfsbuf;
intrv=statvfs(pszDeviceMountPoint,&buf);
if(!rv)
{
printf("wholespace:%uMbytes\n",(buf.f_blocks*buf.f_frsize)/1024/1024);
printf("availspace:%uMbytes\n",(buf.f_bavail*buf.f_frsize)/1024/1024);
}
else
{
perror("statvfs");
return-1;
}
return(buf.f_blocks*buf.f_frsize)/1024/1024;
}
intmain(intargc,char*argv[])
{
intnDiskRoomSize=0;
charszMountPoint[32]={0};
GetDeviceMountPoint(argv[1],szMountPoint);
nDiskRoomSize=GetDeviceRoomSize(szMountPoint);
printf("DiskRoomSize=%dMB\n",nDiskRoomSize);
return 0;
}
Linux 使用statvfs读取文件系统信息的更多相关文章
- linux删除、读取文件原理
linux删除文件原理 LINUX的文件名是存在父目录的block里面,并指向这个文件额inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块.我们删除一个文件,实际上并不 ...
- C# 如何在Linux操作系统下读取文件
发布在Window环境上的微服务需要部署在Linux环境上,本以为没有什么问题,结果因为一处读取文件路径的原因报错了,在此记录一下两个问题:1.C#如何判断当前运行环境是什么操作系统:2.C#读取文件 ...
- Linux shell逐行读取文件的方法
方法1:while循环中执行效率最高,最常用的方法. function while_read_line_bottom(){ while read line do echo $line done < ...
- windows 和 linux 上 循环读取文件名称的区别和方法
function showGetFileName($type){ $url="/opt/mobile_system/gscdn"; //另一台服务器映射到linux过来的路径. # ...
- Linux下 Java 读取文件路径
一般文件路径在windows中用 \ 表示,但是在其他系统平台下比如linux中就不是 \ 所以java给我们提供了一个与平台无关的表示路径的常量 File.separator在windows中则表示 ...
- WinAPI: GetVolumeInformation - 读取文件系统信息
//声明: GetVolumeInformation( lpRootPathName: PChar; {磁盘驱动器代码字符串} lpVolumeNameBuffer: ...
- Linux C 读取文件夹下所有文件(包括子文件夹)的文件名【转】
转自:https://www.cnblogs.com/xudong-bupt/p/3504442.html 本文:http://www.cnblogs.com/xudong-bupt/p/350444 ...
- Linux中常用头文件的作用--转
http://blog.sina.com.cn/s/blog_5c93b2ab0100q62k.html 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言 ...
- Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序
直接上代码 单链表Linux读文件排序: 双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:
随机推荐
- 了解MQ
一.了解RocketMQ? rocketMQ是阿里开源的一款十分优秀的消息队列,rocketMQ具有很多其他消息队列不具有的特性,更重要的是rocketMQ是用java开发的学习成本较低,并且经历了双 ...
- Big Event in HDU (母函数, 玄学AC)
Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't k ...
- 如何在Sitecore CMS中创建项目
从功能区 打开Sitecore的内容编辑器,选择内容树中的项目.创建的项目将作为所选项目的子项添加. Sitecore 8显示所选的Home项目 Sitecore 6和7显示所选的Home项目 功能区 ...
- cocos 搭建安卓环境
http://blog.csdn.net/yiye3376/article/details/42219889
- django之视图view小知识
CBV简版流程 AddPublisher.as_view() ——> view 函数 当请求来的时候才执行view view中执行: 1. 先实例化AddPublisher,给self def ...
- ad 原件布局布线基本规则
一.原件布局基本规则 1.按照电路模块进行布局,电路中的元件应该采用集中就近原则,同时数字电路和模拟电路分开: 2.定位孔.标准孔等周围1.27mm内不得贴元器件,安装孔周围3.5mm不得特装元件 3 ...
- Javascript原生之用cssText批量修改样式
一般情况下我们用js设置元素对象的样式会使用这样的形式: var element= document.getElementById(“id”);element.style.width=”20px”;e ...
- .NET 常用ORM之SubSonic
一.SubSonic简单介绍 SubSonic是一个类似Rails的开源.NET项目.你可以把它看作是一把瑞士军刀,它可以用来构建Website和通过ORM方式来访问数据.Rob Conery和Eri ...
- yield的理解
yield的理解:yield命令是异步两个阶段的分界线需要先对迭代器和生成器进行理解: 迭代器:是一种支持next()操作的对象.它包含一组元素,当执行next()时,返回其中一个元素:当所有元素都被 ...
- 怎样从外网访问内网RESTful API?
本地部署了RESTful API,只能在局域网内访问,怎样从外网也能访问到本地的RESTful API呢?本文将介绍具体的实现步骤. 准备工作 部署并启动RESTful API服务端 默认部署的RES ...