zoukankan      html  css  js  c++  java
  • statfs函数说明

    函数:
        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:信息溢出

    例子:

      1 //说明:pDisk 路径名 如“/home”
      2 
      3 int DH_GetDiskfreeSpacePercent(char *pDisk){
      4     long long freespace = 0;
      5     struct statfs disk_statfs;
      6     long long totalspace = 0;
      7     float freeSpacePercent = 0 ;
      8 
      9     if( statfs(pDisk, &disk_statfs) >= 0 ){
     10         freespace = (((long long)disk_statfs.f_bsize * (long long)disk_statfs.f_bfree)/(long long)1024);
     11         totalspace = (((long long)disk_statfs.f_bsize * (long long)disk_statfs.f_blocks) /(long long)1024);
     12     }
     13 
     14     freeSpacePercent = ((float)freespace/(float)totalspace)*100 ;
     15     return freeSpacePercent ; 
     16 }
     17 
     18 linux df命令实现:
     19 
     20 #include <stdio.h>
     21 #include <stdlib.h>
     22 #include <string.h>
     23 #include <errno.h>
     24 #include <sys/statfs.h>
     25 
     26 static int ok = EXIT_SUCCESS;
     27 
     28 static void printsize(long long n)
     29 {
     30     char unit = 'K';
     31     n /= 1024;
     32     if (n > 1024) {
     33        n /= 1024;
     34        unit = 'M';
     35     }
     36     if (n > 1024) {
     37        n /= 1024;
     38        unit = 'G';
     39     }
     40     printf("%4lld%c", n, unit);
     41 }
     42 
     43 static void df(char *s, int always) {
     44     struct statfs st;
     45 
     46     if (statfs(s, &st) < 0) {
     47         fprintf(stderr, "%s: %s
    ", s, strerror(errno));
     48         ok = EXIT_FAILURE;
     49     } else {
     50         if (st.f_blocks == 0 && !always)
     51            return;
     52         printf("%-20s ", s);
     53         printf("%-20s ", s);
     54         printsize((long long)st.f_blocks * (long long)st.f_bsize);
     55         printf(" ");
     56         printsize((long long)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize);
     57         printf(" ");
     58         printsize((long long)st.f_bfree * (long long)st.f_bsize);
     59         printf(" %d
    ", (int) st.f_bsize);
     60     }
     61 }
     62 
     63 int main(int argc, char *argv[]) {
     64     printf("Filesystem Size Used Free Blksize
    ");
     65     if (argc == 1) {
     66         char s[2000];
     67         FILE *f = fopen("/proc/mounts", "r");
     68 
     69         while (fgets(s, 2000, f)) {
     70             char *c, *e = s;
     71 
     72             for (c = s; *c; c++) {
     73                 if (*c == ' ') {
     74                     e = c + 1;
     75                     break;
     76                 }
     77             }
     78 
     79             for (c = e; *c; c++) {
     80                 if (*c == ' ') {
     81                     *c = '';
     82                     break;
     83                 }
     84             }
     85 
     86             df(e, 0);
     87         }
     88 
     89         fclose(f);
     90     } else {
     91         printf(" NO argv
    ");
     92         int i;
     93 
     94         for (i = 1; i < argc; i++) {
     95             df(argv[i], 1);
     96         }
     97     }
     98 
     99     exit(ok);
    100 }
  • 相关阅读:
    【探路者】Postmortem会议(“事后诸葛亮”会议)
    软件工程第八次作业——例行报告
    感谢
    【探路者】Postmortem会议(“事后诸葛亮”会议)
    软件工程第七次作业——例行报告
    PSP总结报告
    第十二周软件工程作业-每周例行报告
    第十一周软件工程作业-每周例行报告
    感谢Thunder团队
    第十周软件工程作业-每周例行报告
  • 原文地址:https://www.cnblogs.com/elisha-blogs/p/statfs.html
Copyright © 2011-2022 走看看