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.

  1. 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 <cantidad de segundos>.
  2. 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.
  3. 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).
  4. Para procesar un registro correctamente es necesario validar su formato
    1. Un registro esta OK si posee al menos los siguientes 3 campos:
      1. El primer campo: USUARIO: id del usuario que manda el pedido (no validar formato del campo).
      2. 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).
      3. El tercer campo: COMANDO: comando que el usuario desea ejecutar (no validar formato del campo)
      4. El resto de los campos se ignora. El separador de Campos es ”;” (punto y coma).
  5. 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.
  6. Si el registro esta OK; entonces se debe incluir el comando a ejecutar en el archivo Agenda*.sch que corresponda:
    1. Los archivos “Agendahhmm.sch“ son los archivos de salida de Scheduler, se los debe abrir adecuadamente y cerrar siempre dentro del ciclo.
    2. Deben grabarse con el siguiente formato (el separador de campos también es punto y coma)
      1. HORAMINUTO: hora y minuto que se extrae del segundo campo del registro de pedidos.
      2. 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
    3. 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.
    4. 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);
}
materias/75/08/parcial_20050621_1.txt · Última modificación: 2008/08/14 22:28 por leandrus
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia: CC Attribution-Noncommercial-Share Alike 3.0 Unported


Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki