/**************************************************************************************
******************** ALGORITMO DE PETERSON PARA N PROCESOS ****************************
**************************************************************************************/
#include <stdlib.h>
#include "rshmem.h"
#define Nproc 3
#define ENSECR 'S'
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 al fichero de salida */
char *marcaFin[Nproc], /* array que tiene los contenidos de marcafin1,...,marcafinN */
*c[Nproc]; /* array que tiene los contenidos de c1,c2,...,cN */
int *turno, /* variable turno de entrada del proceso */
*recurso, /* puntero a zona de memoria compartida */
nIteraciones=0,/* contador de iteraciones del proceso */
respuesta=0, /* varable indicadora */
i, /* variable contador */
j, /* variable contador */
k=0, /* variable contador */
l; /* variable contador */
/* comprobacion del numero de argumentos */
if(argn!=3){
printf("Error en la entrada de argumentos\n");
exit(1);
}
/* crear zona de memoria compartida */
if(!crearMemoria()){
fprintf(stderr,"Error de crearMemoria()\n");
}
nIteraciones=atoi(argv[1]);
recurso=(int*)memoria;
turno=(int*)recurso+sizeof(int);
marcaFin[0]=(char*)turno+sizeof(int);
for(i=1;i<Nproc;i++)
marcaFin[i]=(char*)marcaFin[i-1]+sizeof(int);
c[0]=(char*)marcaFin[Nproc-1]+sizeof(int);
for(i=1;i<Nproc;i++)
c[i]=(char*)c[i-1]+sizeof(int);
*recurso=0;
for(i=0;i<Nproc;i++)
*(marcaFin[i])='p';
for(i=0;i<Nproc;i++)
*(c[i])='F';
/* creacion de tantos procesos como indique Nproc */
for(i=0;i<Nproc;i++){
if(fork()==0){
/* codigo para los prodesos hijo */
/* Apertura del fichero de salida para el proceso i */
if((fsal=fopen(argv[2],"a+"))==NULL){
printf("Error en la apertura del fichero de salida.\n");
exit(-1);
}
for(j=0;j<nIteraciones;j++){
/* seccion de entrada */
do{
*(c[i])='T';
k=*turno;
while(k!=i){
if(*(c[k])!='F')
k=*turno;
else
k=(k+1)%Nproc;
}
*(c[i])=ENSECR;
k=0;
while((k<Nproc)&&((k==i)||((*(c[k]))!=ENSECR)))
k=k+1;
}while(!((k>=Nproc)&&((*turno==i)||(*(c[*turno])=='F'))));
*turno=i;
/* seccion critica */
incrementa(recurso,5);
fprintf(fsal,"P%d: recurso[%d]= %d\n",i,j,*recurso);
fflush(fsal);
/* seccion de salida */
k=(*turno+1)%Nproc;
while(*(c[k])=='F')
k=(k+1)%Nproc;
*turno=k;
*c[i]='F';
}/* fin for (j) */
/* cierre del fichero de salida del proceso i */
fclose(fsal);
/* marca de terminacion y terminacion de procesos hijo */
*(marcaFin[i])='x';
exit(0);
}/* fin if, fin procesos hijo */
}/* fin for (i) */
/* espera activa del padre por los procesos hijo */
for(l=0;l<Nproc;l++)
while(*(marcaFin[l])!='x');
/* Apertura del fichero de salida de los resultados */
if((fsal=fopen(argv[2],"a+"))==NULL){
printf("Error en la apertura del fichero de salida\n");
exit(-1);
}
fprintf(fsal,"El recurso valia 0 y ahora vale %d y tiene que valer %d\n",*recurso,nIteraciones*Nproc*5);
fflush(fsal);
/* cierre del fichero de salida */
fclose(fsal);
/* eliminacion de la memoria compartida */
if(!eliminarMemoria())
fprintf(stderr,"Error de eliminarMemoria\n");
/* terminacion del proceso padre */
exit(0);
}/* fin main */