/* * ej4.c * * Ejemplo de dos procesos con condiciĆn de carrera */ #include "rshmem.h" void incrementa(int *mem, int k) { int i; i=*mem; TP i=i+k; TP *mem=i; } int main() { int *recurso; char *marcaFin; /* crear zona de memoria compartida */ if (!crearMemoria()) fprintf(stderr, "error de crearMemoria\n"); recurso = (int *) memoria ; marcaFin = memoria + sizeof(int) ; *recurso = 0 ; *marcaFin = 'p' ; if (0!=fork()) { /* proceso padre */ int i; for (i=0; i< 1000; i++) incrementa(recurso, -5); while (*marcaFin != 'x') ; /* espera al hijo */ 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 i; for (i=0; i< 1000; i++) incrementa(recurso, 5); /* termina */ *marcaFin = 'x'; exit(0); } }