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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM