本文转载自: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读取文件系统信息的更多相关文章

  1. linux删除、读取文件原理

    linux删除文件原理 LINUX的文件名是存在父目录的block里面,并指向这个文件额inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块.我们删除一个文件,实际上并不 ...

  2. C# 如何在Linux操作系统下读取文件

    发布在Window环境上的微服务需要部署在Linux环境上,本以为没有什么问题,结果因为一处读取文件路径的原因报错了,在此记录一下两个问题:1.C#如何判断当前运行环境是什么操作系统:2.C#读取文件 ...

  3. Linux shell逐行读取文件的方法

    方法1:while循环中执行效率最高,最常用的方法. function while_read_line_bottom(){ while read line do echo $line done < ...

  4. windows 和 linux 上 循环读取文件名称的区别和方法

    function showGetFileName($type){ $url="/opt/mobile_system/gscdn"; //另一台服务器映射到linux过来的路径. # ...

  5. Linux下 Java 读取文件路径

    一般文件路径在windows中用 \ 表示,但是在其他系统平台下比如linux中就不是 \ 所以java给我们提供了一个与平台无关的表示路径的常量 File.separator在windows中则表示 ...

  6. WinAPI: GetVolumeInformation - 读取文件系统信息

    //声明: GetVolumeInformation(   lpRootPathName: PChar;              {磁盘驱动器代码字符串}   lpVolumeNameBuffer: ...

  7. Linux C 读取文件夹下所有文件(包括子文件夹)的文件名【转】

    转自:https://www.cnblogs.com/xudong-bupt/p/3504442.html 本文:http://www.cnblogs.com/xudong-bupt/p/350444 ...

  8. Linux中常用头文件的作用--转

    http://blog.sina.com.cn/s/blog_5c93b2ab0100q62k.html 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言 ...

  9. Linux 底下使用C语言的 单链表 ,双链表,二叉树 读取文件,并排序

    直接上代码 单链表Linux读文件排序: 双链表Linux读取文件排序: 二叉树LinuX读取文件并排序:

随机推荐

  1. Hbase java api

    export JAVA_HOME=/home/hadoop/app/jdk1.8.0_144export HADOOP_HOME=/home/hadoop/app/hadoop-2.4.1export ...

  2. Vue系列之 => 模拟购物车添加小球动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 擠出線寬(Extrusion width),要怎麼設定?

    擠出線寬(Extrusion width),要怎麼設定? Slic3r的作者,把這邊的%設定,跟"層高"做連結.我個人認為擠出線寬,要以噴頭孔徑當做設定參考才好.層高應該只要設定成 ...

  4. spring 源码导入eclipse(sts)

    一. 准备工作 1.下载安装sts(springsource推荐使用) 下载地址: http://www.springsource.org/downloads/sts-ggts 2.下载安装gradl ...

  5. 数据迁移工具Sqoop和DataX功能比较

    本文转载自: http://www.cnblogs.com/panfeng412/archive/2013/04/29/data-migration-tool-sqoop-and-datax.html ...

  6. flask 表单

    表单 在Web程序中,表单时和用户交互最常见的方式之一.用户注册.登录.撰写文章.编辑设置,无一不用到表单.不过,表单的处理不简单.要创建表单,验证用户输入的内容,向用户显示错误提示,还要获取并保存数 ...

  7. loadRunner回访脚本时报Error -27987: Requested image not found [MsgId: MERR-27987]

    loadRunner录制:登陆订机票网址->订机票的过程 loadRunner回访脚本时报Error -27987: Requested image not found  [MsgId: MER ...

  8. Linux基础命令---vim文本编辑

    vim vim是unix系统最通用的文本编辑器,它的功能可以说是非常强大了,它是vi的升级版.vim有三种工作模式:编辑模式.命令模式.末行模式,默认打开的时候进入命令模式. 此命令的适用范围:Red ...

  9. 转:专题三线程池中的I/O线程

    上一篇文章主要介绍了如何利用线程池中的工作者线程来实现多线程,使多个线程可以并发地工作,从而高效率地使用系统资源.在这篇文章中将介绍如何用线程池中的I/O线程来执行I/O操作,希望对大家有所帮助. 目 ...

  10. git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法

    git使用,多分支合并代码解决冲突,git删除远程分支,删除远程master默认分支方法提交代码流程:1.先提交代码到自己分支上2.切换到devlop拉取代码合并到当前分支3.合并后有变动的推送到自己 ...