programa.c

#include "rshmem.h"

/* funcion que incrementa *mem en k unidades, pudiendo ser k positivo o negativo */
void incrementa(int *mem, int k) {    
   int i;    /* variable auxiliar */
   i=*mem; TP
   i=i+k; TP
   *mem=i;
}

int main() {
   int *recurso;             /* puntero a variable compartida */
   char *marcaFin;       /* puntero a variable:  ='x', el hijo ha terminado; ='p', todavia no */
   char *c_padre;        /* puntero a variable: ='T', el proceso padre quiere entrar; ='N', no */
   char *c_hijo;           /* puntero a variable: ='T', el proceso hijo quiere entrar; ='N', no */
   char *turno;            /* puntero a variable: ='1', el turno es del padre; ='2', el turno es del hijo */
   
/* crear zona de memoria compartida */
   if (!crearMemoria())
      fprintf(stderr, "error de crearMemoria\n");
/* memoria es un puntero a un espacio de memoria compartida que se ha reservado. La cantidad de memoria reservada es grande, por lo que la utilizaremos para las variables anteriores */

/* asignamos direcciones de memoria a los punteros */
   recurso = (int *) memoria ;
   marcaFin = memoria + sizeof(int) ;
   c_padre = marcaFin + sizeof(char);
   c_hijo = c_padre + sizeof(char);
   turno = c_hijo + sizeof(char);

/* inicializamos los cinco punteros a variables */
   *recurso = 0;
   *marcaFin = 'p' ;
   *turno = '1';
   *c_padre = 'T';
   *c_hijo = 'T';

   if (0!=fork()) { /* proceso padre */
      int i;              /* variable contador*/
      for (i=0; i< 1000; i++){          /* bucle 'while' del Algoritmo de Dekker */
         
      /* Algoritmo de Dekker en si */
         *c_padre='T';
         while(*c_hijo=='T'){
            if(*turno=='2'){
               *c_padre='F';
               while(*turno=='2');
               *c_padre='T';
            }
         }
         incrementa(recurso, -5);     /* region critica */
         *turno='2';
         *c_padre='F';
      } /* fin del bucle for */
   /* el proceso padre ha terminado */
      while (*marcaFin != 'x') ; /* espera al hijo */

      /* fin del programa */
      printf("El recurso valia 0 y ahora vale %d.\n", *recurso);
      if (!eliminarMemoria()) /* eliminar memoria compartida */
         fprintf(stderr, "error de eliminarMemoria\n");
      exit(0);
   }else { /* proceso hijo */
      int j;                /* variable contador */
      for (j=0; j< 1000; j++){       /* bucle 'while' del Algoritmo de Dekker */
         
      /* Algoritmo de Dekker en si */
         *c_hijo='T';
         while(*c_padre=='T'){
            if(*turno=='1'){
               *c_hijo='F';
               while(*turno=='1');
               *c_hijo='T';
            }
         }
         incrementa(recurso, 5);       /* region critica */
         *turno='1';
         *c_hijo='F';
      } /* fin del bucle for */
   /* el proceso hijo ha terminado */
      *marcaFin = 'x';
      exit(0);
   } /* fin del else */
} /* fin del main */



Para volver al menú principal, pinche aquí.