• 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 }
  • 相关阅读:
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    205. Isomorphic Strings
    204. Count Primes
    203. Remove Linked List Elements
    201. Bitwise AND of Numbers Range
    199. Binary Tree Right Side View
    ArcGIS API for JavaScript 4.2学习笔记[8] 2D与3D视图同步
  • 原文地址:https://www.cnblogs.com/elisha-blogs/p/statfs.html
Copyright © 2020-2023  润新知