====== 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);
}