5int main(
int argc,
char* argv[]) {
6 unsigned long long divisor = 1;
7 if (argc == 2 && !strcmp(argv[1],
"-m")) {
9 }
else if (argc != 1 && !(argc == 2 && !strcmp(argv[1],
"-k"))) {
10 int help = argc == 2 && !strcmp(argv[1],
"--help");
11 fprintf(help ? stdout : stderr,
"Usage: free [-k|-m]\nShow memory in KiB (default) or MiB.\n");
15 FILE* file = fopen(
"/proc/meminfo",
"r");
17 perror(
"/proc/meminfo");
20 char line[256], key[64], unit[16];
21 unsigned long long total = 0, freeKb = 0, value;
23 while (fgets(line,
sizeof(line), file)) {
24 if (sscanf(line,
"%63s %llu %15s", key, &value, unit) != 3 || strcmp(unit,
"kB"))
26 if (!strcmp(key,
"MemTotal:")) {
29 }
else if (!strcmp(key,
"MemFree:")) {
34 int failed = ferror(file);
36 if (failed || fields != 3 || freeKb > total) {
37 fputs(
"free: invalid memory information\n", stderr);
40 printf(
"%12s %12s %12s %12s\n",
"",
"total",
"used",
"free");
41 printf(
"%12s %12llu %12llu %12llu\n",
"Mem:", total / divisor, (total - freeKb) / divisor,
43 if (fflush(stdout) || ferror(stdout)) {