/* Compile with:
* i686-pc-linux-gnu-gcc hog.c -o hog
*/
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#define MEGA (1 << 20)
#define CHUNK_SIZE MEGA /* one-megabyte chunks */
#define MAX_CHUNKS 4096
const int n_touches = CHUNK_SIZE >> 12; /* average 1 per page */
char *chunks[MAX_CHUNKS];
long int estrtol(const char *s) {
char *end;
long int n;
n = strtol(s, &end, 10);
if (*end != '\0') {
fprintf(stderr, "hog: malformed integer %s\n", s);
exit(1);
}
return n;
}
int main(int ac, const char **av) {
int chunk;
int compression_factor = 3;
unsigned int i, c, x;
long int megabytes;
int random_fd = open("/dev/urandom", O_RDONLY);
char *fake_data = malloc(CHUNK_SIZE);
char *p;
if (ac != 2 && ac != 3) {
fprintf(stderr,
"usage: hog <megabytes> [<compression factor (default = 3)>]\n");
exit(1);
}
megabytes = estrtol(av[1]);
if (megabytes > MAX_CHUNKS) {
fprintf(stderr, "hog: too many megabytes (%ld, max = %d)\n",
megabytes, MAX_CHUNKS);
}
if (ac == 3) {
compression_factor = estrtol(av[2]);
}
/* Fill fake_data with fake data so that it compresses to roughly the desired
* compression factor.
*/
read(random_fd, fake_data, CHUNK_SIZE / compression_factor);
/* Fill the rest of the fake data with ones (compresses well). */
memset(fake_data + CHUNK_SIZE / compression_factor, 1,
CHUNK_SIZE - (CHUNK_SIZE / compression_factor));
for (chunk = 0; chunk < megabytes; chunk++) {
/* Allocate */
p = malloc(CHUNK_SIZE);
if (p == NULL) {
printf("hog: out of memory at chunk %d\n", chunk);
break;
}
/* Fill allocated memory with fake data */
memcpy(p, fake_data, CHUNK_SIZE);
/* Remember allocated data. */
chunks[chunk] = p;
}
printf("hog: idling\n", chunk);
while (1)
sleep(10);
}