Linux下使用fstatfs/statfs查詢系統相關資訊

來源:互聯網
上載者:User

標籤:實現   overflow   name   lib   bre   include   擷取   操作   enter   

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查詢系統相關資訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.