原文网址:http://blog.csdn.net/mociml/article/details/5335474

说明:本文以主要为转载内容,同时加入了我在使用过程中遇到问题对其的修正!!!!!!!!!

先说statfs结构:
#include <sys/vfs.h>    /* 或者 <sys/statfs.h> */

int statfs(const char *path, struct statfs *buf); 
int fstatfs(int fd, struct statfs *buf);

参数:   
path: 位于需要查询信息的文件系统的文件路径名(不是设备名,是挂载点名称)。     
fd: 位于需要查询信息的文件系统的文件描述词。 
buf:以下结构体的指针变量,用于储存文件系统相关的信息

struct statfs 

   long    f_type;     /* 文件系统类型  */ 
   long    f_bsize;    /* 经过优化的传输块大小  */ 
   long    f_blocks;   /* 文件系统数据块总数 */ 
   long    f_bfree;    /* 可用块数 */ 
   long    f_bavail;   /* 非超级用户可获取的块数 */ 
   long    f_files;    /* 文件结点总数 */ 
   long    f_ffree;    /* 可用文件结点数 */ 
   fsid_t  f_fsid;     /* 文件系统标识 */ 
   long    f_namelen;  /* 文件名的最大长度 */ 
}; 
***************************************************************
返回说明:   
成功执行时,返回0。失败返回-1,errno被设为以下的某个值   
  
EACCES: (statfs())文件或路径名中包含的目录不可访问 
EBADF : (fstatfs()) 文件描述词无效 
EFAULT: 内存地址无效 
EINTR : 操作由信号中断 
EIO    : 读写出错 
ELOOP : (statfs())解释路径名过程中存在太多的符号连接 
ENAMETOOLONG:(statfs()) 路径名太长 
ENOENT:(statfs()) 文件不存在 
ENOMEM: 核心内存不足 
ENOSYS: 文件系统不支持调用 
ENOTDIR:(statfs())路径名中当作目录的组件并非目录 
EOVERFLOW:信息溢出
**********************************************************************
相关的文件系统类型有:
      ADFS_SUPER_MAGIC      0xadf5
      AFFS_SUPER_MAGIC      0xADFF
      BEFS_SUPER_MAGIC      0x42465331
   BFS_MAGIC             0x1BADFACE
   CIFS_MAGIC_NUMBER     0xFF534D42
   CODA_SUPER_MAGIC      0x73757245
      COH_SUPER_MAGIC       0x012FF7B7
   CRAMFS_MAGIC          0x28cd3d45
      DEVFS_SUPER_MAGIC     0x1373
      EFS_SUPER_MAGIC       0x00414A53
   EXT_SUPER_MAGIC       0x137D
   EXT2_OLD_SUPER_MAGIC 0xEF51
   EXT2_SUPER_MAGIC      0xEF53
   EXT3_SUPER_MAGIC      0xEF53
   HFS_SUPER_MAGIC       0x4244
   HPFS_SUPER_MAGIC      0xF995E849
   HUGETLBFS_MAGIC       0x958458f6
   ISOFS_SUPER_MAGIC     0x9660
   JFFS2_SUPER_MAGIC     0x72b6
   JFS_SUPER_MAGIC       0x3153464a
      MINIX_SUPER_MAGIC     0x137F /* orig. minix */
   MINIX_SUPER_MAGIC2    0x138F /* 30 char minix */
   MINIX2_SUPER_MAGIC    0x2468 /* minix V2 */
      MINIX2_SUPER_MAGIC2   0x2478 /* minix V2, 30 char names */
   MSDOS_SUPER_MAGIC     0x4d44
   NCP_SUPER_MAGIC       0x564c
   NFS_SUPER_MAGIC       0x6969
   NTFS_SB_MAGIC         0x5346544e
   OPENPROM_SUPER_MAGIC 0x9fa1
     PROC_SUPER_MAGIC      0x9fa0
   QNX4_SUPER_MAGIC      0x002f
      REISERFS_SUPER_MAGIC 0x52654973
   ROMFS_MAGIC           0x7275
   SMB_SUPER_MAGIC       0x517B
   SYSV2_SUPER_MAGIC     0x012FF7B6
   SYSV4_SUPER_MAGIC     0x012FF7B5
      TMPFS_MAGIC           0x01021994
   UDF_SUPER_MAGIC       0x15013346
   UFS_MAGIC             0x00011954
    USBDEVICE_SUPER_MAGIC 0x9fa2
   VXFS_SUPER_MAGIC      0xa501FCF5
   XENIX_SUPER_MAGIC     0x012FF7B4
   XFS_SUPER_MAGIC       0x58465342
   _XIAFS_SUPER_MAGIC    0x012FD16D

**********************************************************************
statfs结构中可用空间块数有两种f_bfree和 f_bavail,前者是硬盘所有剩余空间,后

者为非root用户剩余空间,ext3文件系统给root用户分有5%的独享空间,所以这里是不

同的地方。这里要强调的是每块的大小一般是4K(×这句话错误,不一定都是4k,正确做法是:总大小= sfs.f_blocks×f_bsize,即块数×每块的大小,单位是bytes,也就是要/1024/1024/1024才是GB单位,另外要注意的问题是sfs.f_blocks×f_bsize数据过大溢出,可以sfs.f_blocks/1024×f_bsize/1024=MB单位)。因此,要实现与df结果一致的就得在

获得块数上乘以4,这样已用、可用、总块数就可以实现。如果还要实现百分比一致,

那么要注意的是,df命令获得是整数百分比,没有小数,这里使用的进一法,而不是四

舍五入法。所以在程序里直接+1取整。

disk_size = sfs.f_blocks/1024*sfs.f_bsize/1024;//MB总大小

avilable =sfs.f_bavail/1024*sfs.f_bsize/1024;//MB可以空间大小

double all=sfs.f_blocks - sfs.f_bfree + sfs.f_bavail;

if(0!=all)

percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / all + 1;可用百分比

下面是实现的一个例子:(home目录为一个独立分区)

#include <stdio.h>
#include <sys/vfs.h>

int main()
{
    struct statfs sfs;
    int i = statfs("/home", &sfs);
    int percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / (sfs.f_blocks -

sfs.f_bfree + sfs.f_bavail) + 1;
    printf("/dev/sda11            %ld    %ld  %ld   %d%% /home/n",
                           4*sfs. f_blocks, 4*(sfs.f_blocks - sfs.f_bfree),

4*sfs.f_bavail, percent);
    system("df /home ");
    return 0;

}

执行结果:

leave@LEAVE:~/test$ gcc -o df df.c 
leave@LEAVE:~/test$ ./df 
/dev/sda11            42773008    540356  40059864   2% /home
文件系统           1K-块        已用     可用 已用% 挂载点
/dev/sda11            42773008    540356  40059864   2% /home
leave@LEAVE:~/test$

/home/work $ df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/mmc1                19444      9804      9640  50% /boot
/dev/mmc2                11678        78     11600   1% /setting
/dev/mmc5               160730    126767     25665  83% /home
/dev/mmc6              1758860     35492   1634020   2% /storage
/dev/sdb1            312568828  42536564 270032264  14% /c2-media/usb/USB2

【转】statfs获得硬盘使用情况 模拟linux命令 df相关推荐

  1. java 模拟grep_java模拟linux命令grep

    java模拟linux命令grep. 在网上看到matlab模拟linux的grep命令,就想到用java也来模拟下linux命令grep, 算法非常简单,,这里直接上代码: /** * 模拟Unix ...

  2. Linux命令·df·du

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...

  3. Linux命令df和du

    Linux常用命令之df和du 显示文件或目录所占用的磁盘空间.命令格式:du [option] 文件/目录-h 输出文件系统分区使用的情况,例如:10KB,10MB,10GB等-s 显示文件或整个目 ...

  4. Linux命令-df命令

    df命令: linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况. 可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [ ...

  5. Linux命令df,du 查看系统磁盘空间

    df 和 du 命令 df df 以磁盘分区为单位查看文件系统,可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 例如,我们使用df -h命令来查看磁盘信息, -h 选项为根据大小适当显示: ...

  6. Linux命令 —— df、du

    1. 絮絮叨叨 工作中,经常需要与磁盘打交道 写入大文件前,需要查看磁盘的剩余容量,避免磁盘被写满.影响系统的正常运行 在磁盘存储告警(磁盘写满)时,需要判断哪个目录存在大文件,或者哪个目录可以删除一 ...

  7. 重新启动postgre报错时,解决方案 ( 由备份文件占用空间太大造成 ) (linux 命令 df -h 查看磁盘空间)

    在这里使用了一个liunx下的命令查看磁盘空间 df: disk free  http://www.cnblogs.com/chenwenbiao/archive/2011/08/07/2129831 ...

  8. linux命令--df命令du命令

    2019独角兽企业重金招聘Python工程师标准>>> df命令是用来查看linux文件系统的磁盘占用情况,可以看到目前磁盘占用多少空间及还剩多少空间 其中几个常用的命令如下 命令1 ...

  9. linux命令df卡住怎么办,df-h卡死的处理方法

    首先用strace命令跟踪,查看df命令执行到哪一步开始卡死. root@jzbx_web1 ~]# strace df 中间省略输出内容 stat("/sys/kernel/config& ...

最新文章

  1. 机器学习-预测之时间序列分析预测法原理及实战
  2. 基于plotly数据可视化_[Plotly + Datashader]可视化大型地理空间数据集
  3. mysql基础之四:int(M)中M的含义
  4. WINDOWS 下安装boost
  5. java高级必须懂得_反射---Java高级开发必须懂的
  6. gps高斯utm_高斯-克吕格投影与UTM投影
  7. C++核心编程笔记整理
  8. 阳历转阴历,阳历转中国农历
  9. Linux (deepin)网络管理详解
  10. 如何在 Python 绘图中正常显示中文?(视频教程)
  11. 《关键对话》教你如何摆脱沟通困境
  12. php的惰性加载,thinkphp5.0的惰性加载
  13. 給windowsXP穿上Linux Ubuntu的漂亮馬甲
  14. 基于android的检测心率,基于Android系统的心率信息监测软件的研究与实现
  15. mysql js 命令行登录_MYSQL常用命令
  16. python的函数式编程实例_函数式编程例子
  17. echarts-gauge-bar
  18. 使用adblock屏蔽网页特定内容,例如微博推广
  19. golang实现一个带Web界面的五险一金计算器
  20. 各版本Linux安装软件

热门文章

  1. a*算法matlab代码_导向滤波算法及其matlab代码实现
  2. js增加属性_前端js基础2
  3. 实现对学生信息的修改操作
  4. linux命令注入,Linux kernel本地命令注入漏洞
  5. python爬取学校新闻_python-爬取校园新闻首页的新闻
  6. 什么是互联网大厂_仅限今天!大厂最热数据分析经典实战项目大公开!
  7. Swift 换肤方案的实现使用SwiftTheme框架
  8. ArcGIS水文分析实战教程(9)雨量计算与流量统计
  9. 32位处理器是什么意思
  10. python 小程序,输错三次密码锁定账户