#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]; } fclose(file); tot = 0; for (i = 0; i < MAX_ORDER; i++) tot += buddy[i] * (1 << (i + 2)); #define BUDDY_TO_MB(i) \ ((buddy[i] * (1 << ((i) + 2))) >> 10) #define BUDDY_TO_MB_REM(i, rem) \ ((buddy[i] * (1 << (i + 2))) % 1024 * rem / 1024) printf("% 5lld.%03lldM" "% 5lld.%03lldM" "% 5lld.%03lldM" "% 5lld.%03lldM" "% 5lld.%03lldM" "% 5lld.%03lldM" "% 5lld.%02lldM" "% 5lld.%01lldM" "% 5lldM" "% 5lldM" "% 5lldM" "% 5lldM\n", BUDDY_TO_MB(0), BUDDY_TO_MB_REM(0, 1000), BUDDY_TO_MB(1), BUDDY_TO_MB_REM(1, 1000), BUDDY_TO_MB(2), BUDDY_TO_MB_REM(2, 1000), BUDDY_TO_MB(3), BUDDY_TO_MB_REM(3, 1000), BUDDY_TO_MB(4), BUDDY_TO_MB_REM(4, 1000), BUDDY_TO_MB(5), BUDDY_TO_MB_REM(5, 1000), BUDDY_TO_MB(6), BUDDY_TO_MB_REM(6, 100), BUDDY_TO_MB(7), BUDDY_TO_MB_REM(7, 10), BUDDY_TO_MB(8), BUDDY_TO_MB(9), BUDDY_TO_MB(10), tot >> 10); nanosleep(&sleep, NULL); } return 0; }