├── Makefile ├── README.md ├── justice.c └── LICENSE /Makefile: -------------------------------------------------------------------------------- 1 | 2 | all: justice 3 | 4 | justice: justice.c 5 | gcc justice.c -O2 -o a 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Train-Terminator 2 | 3 | compile, run, wait and then ^C to stop 4 | 5 | ``` text 6 | $ make 7 | $ ./a 8 | Process Name: java -jar w3ka.jar 9 | mem = 29683M 10 | mem = 29432M 11 | mem = 29181M 12 | mem = 28930M 13 | mem = 28680M 14 | mem = 28430M 15 | mem = 28179M 16 | ... 17 | 18 | ``` 19 | 20 | -------------------------------------------------------------------------------- /justice.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | long memtotal() { 5 | char buf[1024]; 6 | char name[256]; 7 | long value, sum = 0; 8 | FILE *f = fopen("/proc/meminfo", "r"); 9 | while (fgets(buf, sizeof(buf), f)) { 10 | sscanf(buf, "%s%ld", name, &value); 11 | if (!strcmp(name, "MemAvailable:") || !strcmp(name, "SwapFree:")) 12 | sum += value; 13 | } 14 | fclose(f); 15 | return sum * 1024; 16 | } 17 | 18 | int main(int argc, char **argv) { 19 | const int PAGE_SZ = 4096; 20 | const int R_SZ = PAGE_SZ * 64000; 21 | long i, j; 22 | printf("Process Name: "); 23 | gets(argv[0]); 24 | while (1) { 25 | sleep(1); 26 | long m = memtotal(); 27 | printf("mem = %ldM\n", m / 1024 / 1024); 28 | if (m>R_SZ) { 29 | if (!fork()) { 30 | char *p = (char*)mmap(0, R_SZ, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 31 | for (j=0; j