首页 > 代码库 > statfs函数说明

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\n", 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\n", (int) st.f_bsize); 60     } 61 } 62  63 int main(int argc, char *argv[]) { 64     printf("Filesystem Size Used Free Blksize\n"); 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 = \0; 82                     break; 83                 } 84             } 85  86             df(e, 0); 87         } 88  89         fclose(f); 90     } else { 91         printf(" NO argv\n"); 92         int i; 93  94         for (i = 1; i < argc; i++) { 95             df(argv[i], 1); 96         } 97     } 98  99     exit(ok);100 }