C++程序  |  86行  |  1.93 KB

/* 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);
}