#include #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; double delay = 1; FILE *file; char str[1024], *s; int ret = 0; struct timespec sleep; if (argc > 1) ret = sscanf(argv[1], "%lf", &delay); sleep.tv_sec = (time_t)delay; sleep.tv_nsec = ((long)(delay * 1000 * 1000 * 1000) % (1000l * 1000l * 1000l)); 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); nanosleep(&sleep, NULL); fclose(file); } return 0; }