中国电信成都营业网点:参考df代码写的一个简单的df命令的源代码

来源:百度文库 编辑:偶看新闻 时间:2024/06/11 07:49:47

参考df代码写的一个简单的df命令的源代码

作者:飞空静渡

 

df命令可以列出加载的磁盘或各种文件的信息:

 

下面给出一个简单的df的命令的源码,这个源码根据df的源码进行改写,很简单,就一个主文件 :)

view plaincopy to clipboardprint?

  1. #include    
  2. #include    
  3. #include    
  4. #include    
  5. static const unsigned long long G = 1024*1024*1024ull;  
  6. static const unsigned long long M = 1024*1024;  
  7. static const unsigned long long K = 1024;  
  8. static char str[20];  
  9. char* kscale(unsigned long b, unsigned long bs)  
  10. {  
  11.     unsigned long long size = b * (unsigned long long)bs;  
  12.     if (size > G)  
  13.     {  
  14.         sprintf(str, "%0.2f GB", size/(G*1.0));  
  15.         return str;  
  16.     }  
  17.     else if (size > M)  
  18.     {  
  19.         sprintf(str, "%0.2f MB", size/(1.0*M));  
  20.         return str;  
  21.     }  
  22.     else if (size > K)  
  23.     {  
  24.         sprintf(str, "%0.2f K", size/(1.0*K));  
  25.         return str;  
  26.     }  
  27.     else  
  28.     {  
  29.         sprintf(str, "%0.2f B", size*1.0);  
  30.         return str;  
  31.     }  
  32. }  
  33. int main(int argc, char *argv[])  
  34. {  
  35.     FILE* mount_table;  
  36.     struct mntent *mount_entry;  
  37.     struct statfs s;  
  38.     unsigned long blocks_used;  
  39.     unsigned blocks_percent_used;  
  40.     const char *disp_units_hdr = NULL;  
  41.     mount_table = NULL;  
  42.     mount_table = setmntent("/etc/mtab", "r");  
  43.     if (!mount_table)  
  44.     {  
  45.         fprintf(stderr, "set mount entry error/n");  
  46.         return -1;  
  47.     }  
  48.     disp_units_hdr = "     Size";  
  49.     printf("Filesystem           %-15sUsed Available %s Mounted on/n",  
  50.             disp_units_hdr, "Use%");  
  51.     while (1) {  
  52.         const char *device;  
  53.         const char *mount_point;  
  54.         if (mount_table) {  
  55.             mount_entry = getmntent(mount_table);  
  56.             if (!mount_entry) {  
  57.                 endmntent(mount_table);  
  58.                 break;  
  59.             }  
  60.         }   
  61.         else  
  62.             continue;  
  63.         device = mount_entry->mnt_fsname;  
  64.         mount_point = mount_entry->mnt_dir;  
  65.         //fprintf(stderr, "mount info: device=%s mountpoint=%s/n", device, mount_point);   
  66.         if (statfs(mount_point, &s) != 0)   
  67.         {  
  68.             fprintf(stderr, "statfs failed!/n");      
  69.             continue;  
  70.         }  
  71.         if ((s.f_blocks > 0) || !mount_table )   
  72.         {  
  73.             blocks_used = s.f_blocks - s.f_bfree;  
  74.             blocks_percent_used = 0;  
  75.             if (blocks_used + s.f_bavail)   
  76.             {  
  77.                 blocks_percent_used = (blocks_used * 100ULL  
  78.                         + (blocks_used + s.f_bavail)/2  
  79.                         ) / (blocks_used + s.f_bavail);  
  80.             }  
  81.             /* GNU coreutils 6.10 skips certain mounts, try to be compatible.  */  
  82.             if (strcmp(device, "rootfs") == 0)  
  83.                 continue;  
  84.             if (printf("/n%-20s" + 1, device) > 20)  
  85.                     printf("/n%-20s", "");  
  86.             char s1[20];  
  87.             char s2[20];  
  88.             char s3[20];  
  89.             strcpy(s1, kscale(s.f_blocks, s.f_bsize));  
  90.             strcpy(s2, kscale(s.f_blocks - s.f_bfree, s.f_bsize));  
  91.             strcpy(s3, kscale(s.f_bavail, s.f_bsize));  
  92.             printf(" %9s %9s %9s %3u%% %s/n",  
  93.                     s1,  
  94.                     s2,  
  95.                     s3,  
  96.                     blocks_percent_used, mount_point);  
  97.         }  
  98.     }  
  99.     return 0;  
  100. }  

 

编译: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