#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

#define PAGESIZE  4096
#define GIGA 1024*1024*1024
#define MENSAJE "Cannot allocate memory\n"

void LlenarGigas (unsigned MaxGigas,char *p, int verboso)
{
    unsigned long long ks=0,megas=0,gigas=0;
    unsigned long index;

    for (index=0; gigas<MaxGigas; index+=PAGESIZE){
     p[index]='z';
     ks=index/1024;
	 megas=ks/1024;
	 gigas=megas/1024;
	 if (verboso){
		printf (" address %p ",p);
		printf ("accedidos %llu gigas, %llu megas %llu %llu ks\n",
                  gigas,megas,ks);
      } /*verboso*/
	 } /*while*/
}

int main (int argc, char *argv[])
{
   size_t tam, ngigas;
   char *p;
   int verboso=1;
   if (argv[1]==NULL) {
        printf ("%s numero_de_gigas a llenar ([-q] para no imprimir\n",argv[0]);
        return 1;
   }

   ngigas=(size_t) atoi(argv[1]);
   tam=(size_t)ngigas*GIGA;
   if ((p=(char *) malloc(tam))==NULL){
        perror ("No puedo asignar memoria:");
        return 1;
    }
   if (argv[2]!=NULL && !strcmp(argv[2],"-q"))
        verboso=0;
   printf ("process pid:%d. Asignado: %llu \n", getpid(),tam);
   while (1)
	LlenarGigas (ngigas,p,verboso);
   free (p); /*superfluo, siempre se acaba con cntrl-c */
}
