Android系统shell中的df命令实现

简介: 当我们在shell中敲击df这条命令的时候,会看到:root@android:/ # dfFilesystem Size Used Free Blksize/dev 446.

当我们在shell中敲击df这条命令的时候,会看到:

root@android:/ # df
Filesystem             Size   Used   Free   Blksize
/dev                  446.8M  36.0K  446.8M   4096
/mnt/secure           446.8M  0.0 K  446.8M   4096
/mnt/asec             446.8M  0.0 K  446.8M   4096
/mnt/cart0            446.8M  0.0 K  446.8M   4096
/mnt/obb              446.8M  0.0 K  446.8M   4096
/system               1.5 G  376.6M  1.1 G   1024
/data                 5.2 G  188.9M  5.0 G   4096
/cache                124.0M  16.1M  107.9M   4096
/mnt/.cci             503.9M  16.4M  487.6M   4096
/storage/sdcard0      5.2 G  188.9M  5.0 G   4096
/mnt/external_sd      7.5 G  475.0M  7.0 G   4096
那么,这是怎么实现的呢?

其实很简单,就是利用statfs这个函数查询文件系统相关的信息,然后依次列举出来。

如果使用这个函数?

请看下文:

http://baike.baidu.com/link?url=EVV8n-l-DXfgNwYj5Lqzo0HFvYaXMYEzTBMVtuyrq0QCvpaD0Lr0RjX81L6jTE6RXplNC_cNec8tgdsDleX2pq

那么df是怎么实现的?请看源码df.c

#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 double n)
{
    char unit = 'K';
    n /= 1024;
    if (n > 1024) {
        n /= 1024;
        unit = 'M';
    }
    if (n > 1024) {
        n /= 1024;
        unit = 'G';
    }
    printf("%-4.1Lf%c", n, unit);
}

static void df(char *s, int always) {
	//
    struct statfs st;
	//statfs函数可用来查询文件系统相关的信息。
    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);
        printsize((long double)st.f_blocks * (long double)st.f_bsize);
        printf("  ");
        printsize((long double)(st.f_blocks - (long double)st.f_bfree) * st.f_bsize);
        printf("  ");
        printsize((long double)st.f_bfree * (long double)st.f_bsize);
        printf("   %d\n", (int) st.f_bsize);
    }
}

int df_main(int argc, char *argv[]) {
    printf("Filesystem             Size   Used   Free   Blksize\n");
    if (argc == 1) {
        char s[2000];
		//挂载的文件都在/proc/mounts下显示
        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 {
        int i;

        for (i = 1; i < argc; i++) {
            df(argv[i], 1);
        }
    }

    exit(ok);
}



目录
相关文章
|
14小时前
|
Java Android开发
Android 设置系统时区的源码追踪
Android 设置系统时区的源码追踪
5 1
|
16小时前
|
Java 开发工具 Android开发
如何访问 android系统hide的类或接口
如何访问 android系统hide的类或接口
6 1
|
3天前
|
存储 安全 Android开发
安卓应用开发:构建一个高效的用户登录系统
【5月更文挑战第3天】在移动应用开发中,用户登录系统的设计与实现是至关重要的一环。对于安卓平台而言,一个高效、安全且用户体验友好的登录系统能够显著提升应用的用户留存率和市场竞争力。本文将探讨在安卓平台上实现用户登录系统的最佳实践,包括对最新身份验证技术的应用、安全性考量以及性能优化策略。
|
12天前
|
Kubernetes Shell 网络安全
Shell脚本快速部署Kubernetes(K8S v1.1版本)集群系统
Shell脚本快速部署Kubernetes(K8S v1.1版本)集群系统
|
12天前
|
缓存 Android开发 开发者
pc上使用命令给android安装apk
pc上使用命令给android安装apk
18 0
|
12天前
|
监控 物联网 数据处理
构建未来:基于Android的智能物联网家居系统
【4月更文挑战第24天】 随着物联网技术的飞速发展,智能家居系统作为其重要分支之一,正逐渐渗透到千家万户。本文将详细探讨如何利用Android平台的灵活性和开放性,设计并实现一个高效、可靠的智能物联网家居系统。我们将从系统的架构设计出发,深入分析关键技术点,包括设备通信协议、用户界面设计以及后台数据处理等方面,并展示通过Android设备进行实时控制和监控的实用性。文章不仅聚焦于技术细节,还将对未来发展趋势及潜在挑战进行前瞻性讨论。
12 0
|
13天前
|
Java Shell Android开发
Android构建系统:Android.mk(3)条件控制详解
Android构建系统:Android.mk(3)条件控制详解
16 1
|
13天前
|
存储 Android开发 开发者
Android构建系统:Android.mk(1)基础概念赋值变量引用详解
Android构建系统:Android.mk(1)基础概念赋值变量引用详解
19 0
|
13天前
|
Android开发
Android构建系统:Android.mk(2)函数详解
Android构建系统:Android.mk(2)函数详解
16 1
|
13天前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
48 1