5
o Guia Cliente Servidor en Java o Uso práctico de Semáforos en C o Uso práctico de mutex en C o Uso práctico de Variables de condición en C o Uso práctico de Pipe en C Pipe Un proceso central controla la informacion que 20 sensores le envian cada 15 segundos. Luego de registrar 10 temperaturas, las promedia (por cada sensor) y las muestra por pantalla . Al final de la ejecucion, el proceso central le envia la señal de terminacion a los sensores y muestra el promedio final de cada sensor. //temperaturas.c /*Para terminar el proceso principal, se le tiene que enviar desde otra terminal la señal SIGUSR2(12) al pid del mismo*/ #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> //Descriptor pipe y constantes para la escritura y lectura int fd[2]; #define ESCRITURA 1 #define LECTURA 0 //Maximo sensores #define SENSORES 20 //Tiempo de espera de cada sensor #define ESPERA 15 //Cantidad de temperaturas que seran promediadas #define PROMEDIAR 9 //Estructura sensores struct hijo{ int pid; int numero; int maxima; int minima; int procesadas; int suma; int totalProcesadas;

Guia Cliente Servidor en Java.docx

Embed Size (px)

Citation preview

Page 1: Guia Cliente Servidor en Java.docx

o Guia Cliente Servidor en Javao Uso práctico de Semáforos en C o Uso práctico de mutex en Co Uso práctico de Variables de condición en Co Uso práctico de Pipe en C

Pipe

Un proceso central controla la informacion que 20 sensores le envian cada 15 segundos. Luego de registrar 10 temperaturas, las promedia (por cada sensor) y las muestra por pantalla. Al final de la ejecucion, el proceso central le envia la señal de terminacion a los sensores y muestra el promedio final de cada sensor. 

//temperaturas.c /*Para terminar el proceso principal, se le tiene que enviar desde otra terminal la señal SIGUSR2(12) al pid del mismo*/ #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> //Descriptor pipe y constantes para la escritura y lectura int fd[2]; #define ESCRITURA 1 #define LECTURA 0 //Maximo sensores #define SENSORES 20 //Tiempo de espera de cada sensor #define ESPERA 15 //Cantidad de temperaturas que seran promediadas #define PROMEDIAR 9 //Estructura sensores struct hijo{ int pid; int numero; int maxima; int minima; int procesadas; int suma; int totalProcesadas; int totalSuma; }sensor[SENSORES]; //Bandera para los sensores int seguir; //Registra temperatura void registrar (int numeroSenial, siginfo_t *infoSenial, void *contex) ; //Termina registro de temperaturas y finaliza sensores void terminar (int senial) ; 

Page 2: Guia Cliente Servidor en Java.docx

int main(void){ system("clear" ); int i; //Buffer de escritura int writebuffer; pid_t pid_sensor, pid_central; pid_central = getpid() ; //Bandera en 1 seguir = 1; //Crear pipe pipe(fd); //Sigaction para la señal SIGUSR1 struct sigaction registro; sigemptyset(&registro.sa_mask) ; registro.sa_flags = SA_SIGINFO | SA_RESTART; registro.sa_sigaction = registrar; if (sigaction(SIGUSR1,&registro,NULL)!=0){ printf("No se pudo asignar la funcion para el tratamiento de la señal SIGUSR1\n" ); exit(1) ; } //Crear sensores for (i=0;i<SENSORES;i++){ if ((pid_sensor=fork())!=0){ sensor.pid = pid_sensor; sensor.numero = i; sensor.maxima = -500; sensor.minima = 500; sensor.procesadas = 0; sensor.suma = 0; sensor.totalSuma = 0; sensor.totalProcesadas = 0; usleep(150000); }else{ //Regenero semilla de numeros aleatorios srand((time(NULL)+i)); //Los sensores pueden capturar la señal SIGTERM signal(SIGTERM,SIG_DFL); //Cierro el lado de lectura del pipe close(fd[LECTURA]); while (seguir == 1){ //Sensor duerme el tiempo definido en ESPERA sleep(ESPERA); //Se le asigna un numero aleatorio entre -70 y 70 writebuffer = -70+(int)(((70+70+1.0)*rand())/(RAND_MAX+1.0)); //Le avisa al proceso central que le va a enviar una temperatura kill(pid_central,SIGUSR1); //Escribe la temperatura en el pipe write(fd[ESCRITURA],&writebuffer,sizeof(writebuffer)); 

Page 3: Guia Cliente Servidor en Java.docx

} //Sensor espera señal pause(); } } //Proceso principal captura señal SIGUSR2 y la trata la funcion terminar signal(SIGUSR2,terminar); //Cierro el lado de escritura del pipe close(fd[ESCRITURA]); printf("Iniciado registro de temperaturas\n" ); for( ;; ); return 0; } void registrar (int numeroSenial, siginfo_t *infoSenial, void *contex){ int i; //Buffer de lectura int readbuffer; int promedio; //Leo desde el pipe la temperatura read(fd[LECTURA],&readbuffer,sizeof(readbuffer)) ; //Busco a que sensor corresponde y la proceso for(i=0;(i<SENSORES) && (sensor.pid!=infoSenial->si_pid); i++) ; printf( "\n" ); printf("Lei la temperatura %d del sensor %d\n",readbuffer,i) ; sensor.totalSuma+= readbuffer; sensor.totalProcesadas++; //Si es la minima if(sensor.minima > readbuffer){ sensor.minima = readbuffer; } //Si es la maxima if(sensor.maxima < readbuffer){ sensor.maxima = readbuffer; } printf("Temperatura minima: %d\n",sensor.minima) ; printf("Temperatura maxima: %d\n",sensor.maxima) ; //Si se registraron 10 temperaturas las promedio if (sensor.procesadas<PROMEDIAR){ sensor.suma +=readbuffer; sensor.procesadas++; }else{ promedio = (int) sensor.suma/sensor.procesadas; printf("Promedio de las ultimas %d temperaturas: %d\n",(PROMEDIAR+1),promedio) ; sensor.suma =0; sensor.procesadas=0; } return; } void terminar (int senial){ 

Page 4: Guia Cliente Servidor en Java.docx

signal(SIGUSR2,terminar) ; int i,promedioGeneral; seguir = 0; printf("\n" ); printf("Terminando sensores\n" ); printf("Sensor\t Estado\n" ); //Termino sensores for (i=0;i<SENSORES;i++){ //Le envio la señal de terminacion a cada sensor kill(sensor.pid,SIGTERM); printf("%d\t Terminado\n",sensor.numero); } printf( "\n" ); printf( "Sensor\t Maxima\t Minima\t Promedio General\n" ); //Promedio general, maxima y minima de cada sensor for (i=0;i<SENSORES;i++){ promedioGeneral = (int) sensor.totalSuma/sensor.totalProcesadas; printf( "%d\t %d\t %d\t\t %d\n",sensor.numero,sensor.maxima,sensor.minima,promedioGeneral); } //Cierro el lado de escritura y lectura del pipe close(fd[ESCRITURA]); close(fd[LECTURA]); exit(0); return; }