--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <ctype.h>
+
+#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;
+}