#include #include #include #include #define MAX_ORDER 11 int main(int argc, char *argv[]) { long long int buddy[MAX_ORDER], bud[MAX_ORDER], tot; long int i; FILE *file; char str[1024], *s; while (1) { file = fopen("/proc/buddyinfo", "r"); if (!file) perror("fopen failed"); for (i = 0; i < MAX_ORDER; i++) buddy[i] = 0; while (fgets(str, sizeof(str), file)) { for (i = 0; i < sizeof(str); i++) if (str[i] == 'z') break; for (; i < sizeof(str); i++) if (isspace(str[i])) break; for (; i < sizeof(str); i++) if (!isspace(str[i])) break; for (; i < sizeof(str); i++) if (isspace(str[i])) break; s = &str[i]; i = sscanf(s, " %lld %lld %lld %lld" "%lld %lld %lld %lld %lld %lld %lld\n", &bud[0], &bud[1], &bud[2], &bud[3], &bud[4], &bud[5], &bud[6], &bud[7], &bud[8], &bud[9], &bud[10]); for (i = 0; i < MAX_ORDER; i++) buddy[i] += bud[i]; } tot = 0; for (i = 0; i < MAX_ORDER; i++) { printf("% 5lld.%02lldM", (buddy[i] * (1 << (i + 2))) >> 10, (buddy[i] * (1 << (i + 2))) % 1024 * 100 / 1024); tot += buddy[i] * (1 << (i + 2)); } printf("% 5lldM\n", tot >> 10); sleep(1); fclose(file); } return 0; }