#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>

int main(void)
{
  char *buffer;
  int fd, ret;

  printf ("pid=%d\n", getpid());
  getchar();
  buffer = mmap(NULL, 16*8192, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
  if (buffer == MAP_FAILED) {
   printf("Gasp\n");
   exit(1);
  }
  printf("Anonymous memory mapped @ %p\n", buffer);

  fd = open("koin", O_RDONLY);
  if (fd < 0) {
    printf("Gasp\n");
    exit(1);
  }
  buffer = mmap (NULL, 16, PROT_READ, MAP_PRIVATE, fd, 0);
  if (buffer == MAP_FAILED) {
    printf("Gasp\n");
    exit(1);
  }
  printf("File 'koin' mapped @ %p\n", buffer);

  getchar();

  ret = fork();
  if (ret < 0) {
    printf ("Gasp\n");
    exit(1);
  }

  if (ret == 0) {
    printf("In the child\n");
    printf("buffer=%c%c%c%c%c\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]);
    getchar();
  }
  else {
    printf("In the parent, child has pid %d\n", ret);
    printf("buffer=%c%c%c%c%c\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]);
    getchar();
  }

  return 0;
}
