轉:參考df代碼寫的一個簡單的df命令的原始碼

來源:互聯網
上載者:User

參考df代碼寫的一個簡單的df命令的原始碼

 

整理轉載:http://blog.csdn.net/fjb2080/article/details/5990355

作者:飛空靜渡

  df命令可以列出載入的磁碟或各種檔案的資訊:

  下面給出一個簡單的df的命令的源碼,這個源碼根據df的源碼進行改寫,很簡單,就一個主檔案

#include <stdio.h>  #include <mntent.h>  #include <string.h>  #include <sys/vfs.h>  static const unsigned long long G = 1024*1024*1024ull;  static const unsigned long long M = 1024*1024;  static const unsigned long long K = 1024;  static char str[20];  char* kscale(unsigned long b, unsigned long bs)  {      unsigned long long size = b * (unsigned long long)bs;      if (size > G)      {          sprintf(str, "%0.2f GB", size/(G*1.0));          return str;      }      else if (size > M)      {          sprintf(str, "%0.2f MB", size/(1.0*M));          return str;      }      else if (size > K)      {          sprintf(str, "%0.2f K", size/(1.0*K));          return str;      }      else      {          sprintf(str, "%0.2f B", size*1.0);          return str;      }  }int main(int argc, char *argv[])  {    FILE* mount_table;      struct mntent *mount_entry;      struct statfs s;      unsigned long blocks_used;      unsigned blocks_percent_used;      const char *disp_units_hdr = NULL;      mount_table = NULL;      mount_table = setmntent("/etc/mtab", "r");      if (!mount_table)      {          fprintf(stderr, "set mount entry error\n");          return -1;      }      disp_units_hdr = "     Size";      printf("Filesystem           %-15sUsed Available %s Mounted on\n",              disp_units_hdr, "Use%");      while (1) {          const char *device;          const char *mount_point;          if (mount_table) {              mount_entry = getmntent(mount_table);              if (!mount_entry) {                  endmntent(mount_table);                  break;              }          }           else              continue;          device = mount_entry->mnt_fsname;                                                                                                      mount_point = mount_entry->mnt_dir;          //fprintf(stderr, "mount info: device=%s mountpoint=%s\n", device, mount_point);          if (statfs(mount_point, &s) != 0)           {              fprintf(stderr, "statfs failed!\n");                      continue;          }          if ((s.f_blocks > 0) || !mount_table )           {              blocks_used = s.f_blocks - s.f_bfree;              blocks_percent_used = 0;              if (blocks_used + s.f_bavail)               {                  blocks_percent_used = (blocks_used * 100ULL                         + (blocks_used + s.f_bavail)/2                        ) / (blocks_used + s.f_bavail);              }              /* GNU coreutils 6.10 skips certain mounts, try to be compatible.  */              if (strcmp(device, "rootfs") == 0)                  continue;              if (printf("\n%-20s" + 1, device) > 20)                  printf("\n%-20s", "");              char s1[20];              char s2[20];              char s3[20];              strcpy(s1, kscale(s.f_blocks, s.f_bsize));              strcpy(s2, kscale(s.f_blocks - s.f_bfree, s.f_bsize));              strcpy(s3, kscale(s.f_bavail, s.f_bsize));              printf(" %9s %9s %9s %3u%% %s\n", s1, s2, s3,                          blocks_percent_used, mount_point);          }      }      return 0;  }  

  編譯:g++ -g -Wall main.cpp

  可以產生一個 a.out 的檔案,

  下面是運行 a.out 和 df -h 的輸出對比:

$/tmp/tmp$ df -h
檔案系統            容量  已用 可用 已用% 掛載點
/dev/sda7             9.4G  6.5G  2.5G  73% /
none                  1.6G  300K  1.6G   1% /dev
none                  1.6G  212K  1.6G   1% /dev/shm
none                  1.6G  296K  1.6G   1% /var/run
none                  1.6G     0  1.6G   0% /var/lock
none                  1.6G     0  1.6G   0% /lib/init/rw
/dev/sda6             113G   87G   26G  77% /media/work_
/dev/sda9              26G   23G  2.0G  92% /home

 

/tmp/tmp$ ./a.out
Filesystem                Size      Used Available Use% Mounted on
/dev/sda7              9.39 GB   6.45 GB   2.46 GB  72% /
none                   1.59 GB  300.00 K   1.59 GB   0% /dev
none                   1.60 GB 1020.00 K   1.59 GB   0% /dev/shm
none                   1.60 GB  296.00 K   1.59 GB   0% /var/run
none                   1.60 GB    0.00 B   1.60 GB   0% /var/lock
none                   1.60 GB    0.00 B   1.60 GB   0% /lib/init/rw
/dev/sda6            112.62 GB  86.67 GB  25.95 GB  77% /media/work_
/dev/sda9             25.38 GB  22.10 GB   1.99 GB  92% /home

-----------------華---麗---的---分---割---線-----------------

轉載時本人將源碼中的 /n 改為 \n 。

df 的源碼就在 Coreutils 項目中。Coreutils 是 GNU 作業系統的核心工具,包含了許多基本命令,例如cp 、rm 等。想瞭解更多或者下載最新的源碼,請點擊這裡。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.