#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 */