Algoritmo de Peterson
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | /* *********** ALGORITMO DE PETERSON ************ */ #include <stdlib.h> #include "rshmem.h" void incrementa(int *mem, int k) { int i; i=*mem; TP i=i+k; TP *mem=i; } int main(int argn, char **argv) { FILE *fsal; /*Puntero a fichero con salida de resultados*/ char *marcaFin, /*Puntero fin de zona de memoria compartida*/ *c1, /*Variable de cerradura Proceso Padre*/ *c2; /*Variable de cerradura Proceso Hijo*/ int *turno, /*Variable turno de entrada del proceso*/ *recurso, /*Puntero a zona de memoria compartida*/ nIteraciones=0; /*Contador de iteracciones del proceso*/ /* Comprobacion del numero de argumentos */ if(argn!=3){ printf("Error en la entrada de argumentos/n"); exit(1); } /*Apertura de ficheros*/ if((fsal=fopen(argv[2],"a+"))==NULL){ printf("Error de apertura en el fichero de salidan"); exit(-1); } /*Comprobacion de apertura correcta del fichero de texto de entrada*/ nIteraciones = atoi(argv[1]); /* crear zona de memoria compartida */ if (!crearMemoria()) fprintf(stderr, "error de crearMemorian"); recurso = (int *) memoria ; turno = (int *) recurso + sizeof(int); marcaFin = (char *) turno + sizeof(int) ; c1 = (char *) marcaFin + sizeof(char); c2 = (char *) c1 + sizeof(char); *recurso = 0 ; *marcaFin = 'p' ; *c1='F'; *c2='F'; if (0!=fork()) { /* Proceso Padre */ int i; fprintf(fsal,"P1: SOY EL PROCESO PADREn"); for (i=0; i<nIteraciones; i++){ *c1='T'; /* Seccion */ *turno=2; /* de */ while (((*c2)=='T') && ((*turno)==2)); /* entrada */ incrementa(recurso, -5); /* Seccion */ fprintf(fsal,"P1: recurso[%d]=%dn", i, *recurso); /* critica */ *c1='F'; /* Seccion de salida */ }/* fin del for */ while (*marcaFin != 'x') ; /* El Proceso Padre espera al Poceso Hijo */ fprintf(fsal,"El recurso valia 0 y ahora vale %dn", *recurso); if (!eliminarMemoria()) /* eliminar memoria compartida */ fprintf(stderr, "error de eliminarMemorian"); exit(0); }/*if (0!=fork())*/ else { /* Proceso Hijo */ int i; fprintf(fsal,"P2: SOY EL PROCESO HIJOn"); for (i=0; i<nIteraciones; i++) { *c2='T'; /* Seccion */ *turno=1; /* de */ while (((*c1)=='T') && ((*turno)==1)); /* entrada */ incrementa(recurso, 5); /* Seccion */ fprintf(fsal,"P2: recurso[%d]=%dn", i, *recurso); /* critica */ *c2='F'; /* Seccion de salida */ } /* fin del for */ /*Cierre de los ficheros*/ fclose(fsal); /* termina */ *marcaFin = 'x'; exit(0); }/*fin else Proceso Hijo*/ }/* *************** FIN MAIN ****************** */ |
¿Has encontrado algún error? ¿Tienes la solución? Dejame tu correción ;-)
Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress las eliminó al verlas como etiquetas HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios. Y lo mas importante: Todos los ejemplos fueron realizados por personas con únicamente conocimiento básico del lenguaje, no de programación.
Otro punto importante: Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:
- Si es lenguaje C <code lang="c">Código en C</code>
- Si es lenguaje Pascal <code lang="pascal">Aquí dentro el código de Pascal</code>.
De esta manera el código coloreas el código.
Otro punto importante para muchos que crees que te he ignorado: Todos los comentarios los reviso y en su debido momento los apruebo, pero ojo con el con lo siguiente:Me reservo el derecho de alterar, publicar o no los comentarios así como también cambiar mis condiciones en el momento que yo lo requiera.
¿Si estas de acuerdo? Adelante! que ya te he quitado bastante tiempo leyendo esta basura :)