====== Examen Parcial - 75.08. Sistemas Operativos ====== **Cátedra:** Osvaldo Clua\\ **Fecha:** Tercera Oportunidad - Primer Cuatrimestre 2005\\ **Día:** 21/06/2005\\ **Tema:** PERL Esta página está incompleta; podés ayudar completando el material. ===== Enunciado ===== Desarrollar un comando PERL denominado "Scheduler.pl" que tiene por función armar la agenda de ejecución de pedidos del día. - Scheduler arma la agenda cada media hora, **es un proceso que nunca termina**, duerme 30 minutos. se ejecuta, luego duerme 30 minutos nuevamente, se ejecuta y asi sucesivamente. En PERL la función sleep tiene la siguiente sintaxis **sleep** . - Cada vez que despierta Schedutles debe leer todos los archivos ***.ped** que haya en su directorio y luego cambiarle el nombre a ***.pro**(para evitar leerlo en el próximo ciclo). No preocuparse en este punto por la posibilidad de archivos duplicados. - Por cada archivo de Pedidos Scheduler debe procesar todos sus registros (la cantidad de registros de cada archivo es variable, pueden venir de 1 a N registros). - Para procesar un registro correctamente es necesario validar su formato - Un registro esta OK si posee al menos los siguientes 3 campos: - El primer campo: USUARIO: id del usuario que manda el pedido (no validar formato del campo). - El segundo campo: HORAMINUTO : hora y minutos en que el usuario desea que se ejecute su pedido (formato hhmm donde **hh va de 00 a 23 y mm va de 00 a 59**). - El tercer campo: COMANDO: comando que el usuario desea ejecutar (no validar formato del campo) - El resto de los campos se ignora. El separador de Campos es ";" (punto y coma). - Si un registro no posee formato correcto, el registro es rechazado y scheduler lo debe grabar **tal cual lo leyó** en el archivo **rechazados.dat** agregándolo al final. - Si el registro esta OK; entonces se debe incluir el comando a ejecutar en el archivo **Agenda*.sch** que corresponda: - Los archivos **"Agendahhmm.sch"** son los archivos de salida de Scheduler, se los debe abrir adecuadamente y cerrar **siempre dentro del ciclo**. - Deben grabarse con el siguiente formato (el separador de campos también es punto y coma) - HORAMINUTO: hora y minuto que se extrae del segundo campo del registro de pedidos. - COMANDO: comando a ejecutar que se extrae del tercer campo del registros de pedidos. ATENCIÓN: como todos estos comando son comandos de linea, es obligatorio que lleven un **new line al final**. **Scheduler no interpreta ni ejecuta al comando, solo lo pasa a la agenda correspondiente** - Los valores posibles de hhmm son : 0000, 0030, 0100, ...1230,1300,1330,...,2230,2300,2330. Scheduler graba los pedidos a ser ejecutados a partir de la hora hhmm hasta la hora hhmm + 29 minutos. - Si algún archivo Agenda*.sch no existiera, scheduler lo debe crear. ===== Archivos de prueba ===== __**Archivos de Pedidos**__\\ Nombre del Archivo: **imprime33.ped** (con 1 registro)\\ Pgarcia;2015;imprimir listado001 listado002 listado003;impresion de los listados de compras de mayo Nombre del Archivo: **tijuana.ped** (con 7 registros)\\ M_gomez;2000;rankingcity.pl zonanorte.dat Parana;calculo de los totales de llamados de Parana-Norte\\ M_gomez;2001;imprimir salidacity\\ M_gomez;2010;rankingcity.pl zonasur.dat Parana;calculo de los totales de llamados de Parana-Sur\\ M_gomez;2011;imprimir salidacity\\ M_gomez;2030;rankingcity.pl zonaamba.dat Parana;calculo de los totales de llamados de Parana-AMBA\\ M_gomez;2031;imprimir salidacity\\ A_sanchez;saca_saldo.pl rosario28.dat 2 4 ccmayo28.sal;Saldos en Cta Cte de mayo en la sucursal 28\\ __**Archivos de Agenda**__\\ Nombre del Archivo: **agenda200.sch** (con 5 registros)\\ 2015;imprimir listado001 listado002 listado003\\ 2000;rankingcity.pl zonanorte.dat Parana\\ 2001;imprimir salidacity\\ 2010;rankingcity.pl zonasur.dat Parana\\ 2011;imprimir salidacity\\ Nombre del archivo: **agenda2030.sch** (con 2 registros)\\ 2030;rankingcity.pl zonaamba.dat Parana\\ 2031;imprimir salidacity\\ **Rechazados.dat** (con 1 registro)\\ A_sanchez;saca_saldo.pl rosario28.dat 2 4 ccmayo28.sal;Saldos en Cta Cte de mayo en la sucursal 28 __**Archivos Procesados**__\\ **imprime33.pro**\\ **tijuana.pro**\\ ===== Resolución ===== #!/usr/bin/perl sub moverArchivos(){ @archivos=<*.ped>; foreach $archivo (@archivos) { `mv $archivo $archivo.pro` } } sub getFileList(){ @archivo=<*.pro>; return @archivo; } sub procesarArchivo { $regexp="([01][0-9]|2[0-3])[0-5][0-9]"; $rechazado=0; open($fdrech,">>rechazados")|| die "rechazdos: $!"; open($fd,"<@_")||die "@_: $!"; while(<$fd>){ chomp($_); if ($_ ne ""){ @campos=split(";",$_); if(@campos>3){ if($campos[1]=~$regexp){ $rechazado=0; } else { $rechazado=1; } } else { $rechazado=1; } if ($rechazado==1){ print $fdrech "$_\n"; } else { $hora=substr($campos[1],0,2); $minutos=substr($campos[1],2); if($minutos>29){ $hora++; if($hora==24) { $hora=="00"; } $minutos="00"; } else { $minutos="30"; } open($fdsc,">>scheduler$hora$minutos")||die "scheduler$hora$minutos[1]rechazdos: $!"; print $fdsc "$hora$minutos;$campos[2]\n"; close($fdsc); } } } close($fd); close($fdrech); } while (true) { print "Procesando...\n"; moverArchivos(); @archivos=getFileList(); foreach $archivo ( @archivos ) { procesarArchivo($archivo); } sleep(5); }