Implementation of df Command in shell for Android System

  • 2021-10-27 08:51:45
  • OfStack

When we hit the command df in shell, we will see:


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

So, how did this come about?

In fact, it is very simple, that is, using statfs this function to query the information related to the file system, and then enumerate it in turn.

If you use this function?

See below:

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

So how is df implemented? See source code df. c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/statfs.h>
static int ok = EXIT_SUCCESS;
// Calculates based on the size of the mounted file 
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 Function can be used to query information about the file system. 
  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];
 // The mounted files are all in the /proc/mounts Display below 
    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);
}

Summarize


Related articles: