Linux下使用fstatfs/statfs查询系统相关信息

1.   功能

#include < sys/statfs.h >

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

int fstatfs(int fd, struct statfs *buf);

查询文件系统相关的信息。

2.   参数

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; /* 文件名的最大长度 */

};

3.   返回值

成功执行时,返回0。失败返回-1,errno被设为以下的某个值

EACCES: (statfs())文件或路径名中包含的目录不可访问

EBADF : (fstatfs())文件描述词无效

EFAULT: 内存地址无效

EINTR : 操作由信号中断

EIO : 读写出错

ELOOP : (statfs())解释路径名过程中存在太多的符号连接

ENAMETOOLONG:(statfs()) 路径名太长

ENOENT:(statfs()) 文件不存在

ENOMEM: 核心内存不足

ENOSYS: 文件系统不支持调用

ENOTDIR:(statfs())路径名中当作目录的组件并非目录

EOVERFLOW:信息溢出

4.   实例

#include <sys/vfs.h>

#include <stdio.h>

int main()

{

struct statfs diskInfo;

statfs("/",&diskInfo);

unsigned long long blocksize =diskInfo.f_bsize;// 每个block里面包含的字节数

unsigned long long totalsize =blocksize * diskInfo.f_blocks;//总的字节数

printf("TOTAL_SIZE == %luMB/n",totalsize>>20); // 1024*1024 =1MB  换算成MB单位

unsigned long long freeDisk =diskInfo.f_bfree*blocksize; //再计算下剩余的空间大小

printf("DISK_FREE == %ldMB/n",freeDisk>>20);

return 0;

}

附:

linux df命令实现:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <sys/statfs.h>

static int ok = EXIT_SUCCESS;

static void printsize(long long n)

{

  char unit = 'K';

  n /= 1024;

  if (n > 1024) {

           n /= 1024;

           unit = 'M';

  }

  if (n > 1024) {

           n /= 1024;

  unit = 'G';

  }

  printf("%4lld%c", n, unit);

}

static void df(char *s, int always) {

  struct statfs st;

if (statfs(s, &st) < 0) {

  fprintf(stderr,"%s: %s\n", s, strerror(errno));

  ok = EXIT_FAILURE;

} else {

  if(st.f_blocks == 0 && !always)

  return;

  printf("%-20s", s);

  printf("%-20s", s);

  printsize((longlong)st.f_blocks * (long long)st.f_bsize);

  printf("");

  printsize((longlong)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize);

  printf("");

  printsize((longlong)st.f_bfree * (long long)st.f_bsize);

  printf("%d\n", (int) st.f_bsize);

}

}

int main(int argc, char *argv[]) {

  printf("Filesystem Size Used Free Blksize\n");

  if (argc == 1) {

           char s[2000];

           FILE *f =fopen("/proc/mounts", "r");

while (fgets(s, 2000, f)) {

           char *c, *e = s;

for (c = s; *c; c++) {

                              if(*c == ' ') {

                              e =c + 1;

                              break;

                     }

       }

for (c = e; *c; c++) {

                if (*c == '') {

                *c = '\0';

                     break;

           }

}

df(e, 0);

}

fclose(f);

  } else {

  printf(" NO argv\n");

  int i;

for (i = 1; i< argc; i++) {

       df(argv[i],1);

  }

  }

exit(ok);

}

Linux下使用fstatfs/statfs查询系统相关信息相关推荐

  1. 查看linux的用户 7.2,linux下查看用户登入系统相关命令及编写脚本(七)

    linux下查看用户登入系统相关命令及编写脚本(七) 查看用户登入系统日志 1.w 显示谁登入并正在做什么事 2.who 显示谁登入 -r:显示系统运行级别 3.sleep 睡眠命令(sleep 5 ...

  2. Linux下安装 SkyWalking 分布式追踪系统

    Linux下安装 SkyWalking 分布式追踪系统 1.SkyWalking简介 1.1 SkyWalking介绍 SkyWalking项目是由华为大牛吴晟开源的个人项目,目前已经加入Apache ...

  3. Linux下的文件系统与目录系统简介

    Linux下的文件系统与目录系统简介 一. 文件系统 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL ...

  4. linux如何修改ip文件夹,求助!Linux下C++程序如何修改系统IP?

    求助!Linux下C++程序如何修改系统IP? 发布时间:2014-11-19 19:00:55来源:红联作者:firespout 项目是用C++做的,需要修改系统IP,本以为这种很通用的功能已经有成 ...

  5. Linux之显示系统相关信息

    戊戌年1月4日 姓名:Kevin 1.显示系统相关信息 uname -a(全部信息) -s(系统名) -n(网络上主机名) -r(内核版本) -v(系统版本) -m(硬件类型) 2.显示/修改计算机主 ...

  6. linux系统怎么查看raid卡信息,LINUX下查SCSI卡、RAID卡信息的命令

    Linux下查SCSI卡.RAID卡信息的命令 shell#cat /proc/scsi/scsi shell#/sbin/lspci shell#/usr/sbin/dmidecode 例: [ro ...

  7. linux查看某进程的连接,linux下查看指定进程的所有连接信息(转)

    定位某个进程的网络故障时经常需要用到的一个功能就是查找所有连接的信息.通常查找某个端口的连接信息使用 ss 或者 netstat 可以轻松拿到,如果是主动与别的机器建立的连接信息则可以通过 lsof ...

  8. 安卓开发 登录用户信息缓存_在Linux上使用finger命令查询登录用户信息

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 本文主要讲解finger命令的作用和日常使用案例. f ...

  9. Linux下清除磁盘分区及残留raid信息

    Linux下清除磁盘分区及残留raid信息 适用场景: 1. 查看硬盘编号 2. 删除磁盘分区 3. 删除磁盘内残留raid信息 *本文适用于430-8i等只有低速格式化或没有格式化功能的HBA卡使用 ...

最新文章

  1. python之vscode中手动选择python解释器(mac)
  2. DL:The development history of the important stage of DL
  3. mac 配置php和mysql_Mac下配置PHP+MySql环境
  4. 【搜索树】高级打字机(luogu 1383)
  5. 原生js实现简单的焦点图效果
  6. 湖北大学计算机袁云,暑期走访不停歇 远赴异地送关怀——学校慰问离退休教职工和校友...
  7. Java基础入门笔记-链表与容器
  8. mysql convert报错_部署mysql版本项目问题记录
  9. 如何修改一个类的私有成员?
  10. 浏览器与node事件循环
  11. MySQL 第七次练习(存储过程函数)
  12. 【渝粤教育】21秋期末考试物权法10774k1
  13. ARCHICAD 25 for Mac(cad绘图软件)
  14. Android远程过程通讯,Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析(3)...
  15. 安装SQL Server 2000 出现挂起文件,需要重启该如何解决?
  16. 产品读书.心理学《梦的解析》
  17. 如何在Excel表中快速提取想要的数据
  18. 【数据结构】单链表的创建、插入、删除及合并
  19. 超链接 番茄札记 html,番茄学习法笔记以及初始尝试
  20. 黑苹果oc清除nvram_基于OpenCore0.6.1的黑苹果安装,小白也能看

热门文章

  1. CF313D Ilya and Roads(区间DP)
  2. 如何升级PowerShell
  3. Struts2之初识篇(一)——与struts的区别和基本配置
  4. Drupal 6 将于 2016 年 2 月 14 日终结生命周期
  5. 任正非:华为三十年大限快到了,想不死就得新生
  6. Hibernate关联关系映射-----单向一对一映射配置
  7. Primavera P6 安装配置指南
  8. 移植性问题のCString类型转换,字符串操作和UNICODE、ANSI字符集
  9. svn 合并问题 MERGE of '/svn/web': 200 OK (http://xx.xx.xx.xx)
  10. DreamWeaver做ASP 服务器配置篇