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

作者:飞空静渡

 

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

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值