]> git.itanic.dy.fi Git - buddywatch/blob - buddywatch.c
Close file earlier
[buddywatch] / buddywatch.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <ctype.h>
5 #include <time.h>
6
7 #define MAX_ORDER 11
8
9 int main(int argc, char *argv[])
10 {
11         long long int buddy[MAX_ORDER], bud[MAX_ORDER], tot;
12         long int i;
13         double delay = 1;
14         FILE *file;
15         char str[1024], *s;
16         int ret = 0;
17         struct timespec sleep;
18
19         if (argc > 1)
20                 ret = sscanf(argv[1], "%lf", &delay);
21
22         sleep.tv_sec = (time_t)delay;
23         sleep.tv_nsec = ((long)(delay * 1000 * 1000 * 1000) %
24                         (1000l * 1000l * 1000l));
25
26         while (1) 
27         {
28                 file = fopen("/proc/buddyinfo", "r");
29                 if (!file)
30                         perror("fopen failed");
31
32                 for (i = 0; i < MAX_ORDER; i++)
33                         buddy[i] = 0;
34
35                 while (fgets(str, sizeof(str), file)) {
36                         for (i = 0; i < sizeof(str); i++)
37                                 if (str[i] == 'z')
38                                         break;
39
40                         for (; i < sizeof(str); i++)
41                                 if (isspace(str[i]))
42                                         break;
43
44                         for (; i < sizeof(str); i++)
45                                 if (!isspace(str[i]))
46                                         break;
47
48                         for (; i < sizeof(str); i++)
49                                 if (isspace(str[i]))
50                                         break;
51
52                         s = &str[i];
53
54                         i = sscanf(s, " %lld %lld %lld %lld"
55                                    "%lld %lld %lld %lld %lld %lld %lld\n",
56                                    &bud[0], &bud[1], &bud[2], &bud[3], &bud[4],
57                                    &bud[5], &bud[6], &bud[7], &bud[8], &bud[9],
58                                    &bud[10]);
59                         for (i = 0; i < MAX_ORDER; i++)
60                                 buddy[i] += bud[i];
61                 }
62                 fclose(file);
63
64                 tot = 0;
65                 for (i = 0; i < MAX_ORDER; i++)
66                         tot += buddy[i] * (1 << (i + 2));
67
68 #define BUDDY_TO_MB(i)                                  \
69                 ((buddy[i] * (1 << ((i) + 2))) >> 10)
70 #define BUDDY_TO_MB_REM(i, rem)                                         \
71                 ((buddy[i] * (1 << (i + 2))) % 1024 * rem / 1024)
72
73                 printf("% 5lld.%03lldM"
74                         "% 5lld.%03lldM"
75                         "% 5lld.%03lldM"
76                         "% 5lld.%03lldM"
77                         "% 5lld.%03lldM"
78                         "% 5lld.%03lldM"
79                         "% 5lld.%02lldM"
80                         "% 5lld.%01lldM"
81                         "% 5lldM"
82                         "% 5lldM"
83                         "% 5lldM"
84                         "% 5lldM\n",
85                         BUDDY_TO_MB(0), BUDDY_TO_MB_REM(0, 1000),
86                         BUDDY_TO_MB(1), BUDDY_TO_MB_REM(1, 1000),
87                         BUDDY_TO_MB(2), BUDDY_TO_MB_REM(2, 1000),
88                         BUDDY_TO_MB(3), BUDDY_TO_MB_REM(3, 1000),
89                         BUDDY_TO_MB(4), BUDDY_TO_MB_REM(4, 1000),
90                         BUDDY_TO_MB(5), BUDDY_TO_MB_REM(5, 1000),
91                         BUDDY_TO_MB(6), BUDDY_TO_MB_REM(6, 100),
92                         BUDDY_TO_MB(7), BUDDY_TO_MB_REM(7, 10),
93                         BUDDY_TO_MB(8),
94                         BUDDY_TO_MB(9),
95                         BUDDY_TO_MB(10),
96                         tot >> 10);
97
98                 nanosleep(&sleep, NULL);
99         }
100         return 0;
101 }