Anda di halaman 1dari 32

Prctica 2: Realizacin de una Alarma Temporizada

Diseo de Sistemas Operativos U ! P " #

David Jess Horat Flotats Enrique Fernndez Perdomo

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

ndice
). '*plicacin del Pro+rama desarrollado.................................................................... 2
Pro+rama Principal........................................................................................................................ 2
,aria-les Tarea (ue realiza Parmetros .ovimiento de la -ola

eales........................................................................................................................................... /
Alarma 0en Tiempo Real1 )nterrupcin

$anzamiento de Procesos.............................................................................................................22
#so de 3or4 #so de e*ec #so de 5aitpid #so de e*it

&ontrol de la eccin &r6tica7 con Pipes......................................................................................28


De3inicin de Pipe .ane9o de Pipe Pro-lema de la eccin &r6tica olucin a la eccin &r6tica

)). &ompilacin : '9ecucin del pro+rama 0.a4e3ile1................................................2;


'*plicacin : Re+las del .a4e3ile.............................................................................................. 2; '9ecucin del pro+rama............................................................................................................... 22
Paso de Parmetros

))).Ane*o " &di+o Fuente..........................................................................................2<


alarma.c........................................................................................................................................2< .a4e3ile....................................................................................................................................... =;

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

Explicacin del Programa desarrollado


Programa Principal
Variables $as varia-les de3inidas son de dos tipos 3undamentales: +lo-ales : locales a la 3uncin main. $a utilidad de las varia-les +lo-ales radica en el >ec>o de (ue sern usadas por 3unciones a las (ue se llama en el momento de producirse las seales7 como la alarma7 de modo (ue no pueden pasarse por parmetro. $as varia-les +lo-ales son las si+uientes: 2. Tu-er6a para el control de la concurrencia7 mediante el uso de pipes 0int tuberia[2]1. 2. Tiempo de duracin de la alarma 0int tiempo_alarma = 41. $as varia-les locales son las si+uientes: 2. ,aria-les para controlar el movimiento de la -ola: 2. &olumna inicial7 en la (ue empieza la -ola 0int columna = 01. 2. &olumna m*ima a la (ue puede lle+ar la -ola 0int max_columna = 401. =. Paso7 (ue indica el n?mero de columnas (ue avanza la -ola en cada iteracin de muestreo de la misma 0int paso = 11. @. ,elocidad de la -ola7 (ue se controla con el n?mero de iteraciones de un -ucle7 de modo (ue mientras menor sea el valor de esta varia-le ma:or ser la velocidad : viceversa7 aspecto (ue de-e tenerse en cuenta al asi+narle un valor 0int velocidad = 300000001. 2. ,aria-le para tomar el valor de las lecturas : escrituras de las tu-er6as 0int valor1. =. ,aria-le para la realizacin de iteraciones7 : tareas au*iliares 0int i1. @. )ndicacin de seales creadas 0int senal_creada = 0;1. A. Ristra (ue representa la -ola 0char *bola = "o";1. 8. 'structuras de las seales para la implementacin con
senal_alarma, senal_int;1.

)%A&T)!B 0struct sigaction

e puede o-servar (ue la ma:or6a de las varia-les son inicializadas en el momento de su de3inicin7 de modo (ue as6 se tendrn valores por de3ecto para las mismas.

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

Tarea que realiza 'l pro+rama principal >ar un uso intensivo de la salida por pantalla. Para ello se >ace uso de la 3uncin printf. 'l uso de esta 3uncin o-li+a a incluir la li-rer6a <stdio.h>. #na alternativa al uso de las 3unciones de la li-rer6a stdio es el uso de li-rer6as especiales para el mane9o de la impresin en el terminal. Destacan las li-rer6as conio : ncurses. $a li-rer6a ncurses es ampl6sima : de +ran utilidad para el mane9o del terminal de $inu* : la impresin de cadenas de caracteres en el mismo. 'l pro-lema de la li-rer6a ncurses7 (ue se incluir6a en nuestro pro+rama como <curses.h>7 es (ue mane9a una pantalla propia7 distinta a la (ue usa la 3uncin printf. Hasta a(u6 no >a: pro-lema7 pero si se usa la 3uncin printf a la vez (ue se emplean 3uncin de la li-rer6a ncurses7 como move : addch7 una pantalla mover a la otra : el resultado ser desastrosoC adems7 da un aspcto de concurrencia incontrolada7 del todo indesea-le para cual(uier pro+rama serio. Finalmente7 la salida del pro+rama para imprimir por pantalla se >ar con la 3uncin printf. 'l pro+rama desarrollado imprimir en pantalla un -ola (ue se mover re-otando de derec>a a iz(uierda7 en una l6nea de la pantallaC sin tener en cuenta el e3ecto (ue tendr el muestreo de la 3ec>a7 >asta (ue se introduzca Dsta con la alarma. 'n realidad7 se >ar una emulacin de la -ola con un carcter. Bo o-stante7 el pro+rama permitir (ue dic>a emulacin de la -ola pueda ser incluso una ristra de cual(uier dimensin 0en principio ma:or (ue la unidad7 es decir7 (ue al menos sea un carcter1. 'l pro+rama principal main realizar una serie de tareas principales o pasos7 (ue se indican : comentan a continuacin: Paso 1: Parmetros de entrada 'l pro+rama principal7 una vez compilado : construido7 en el momento de e9ecutarse permitir la rececpcin de parmetros desde el terminal7 para (ue la con3i+uracin del misma sea ma:or : ms 3le*i-le. De este modo la 3uncin main tiene la 3orma:
int main(int argn, char *argv[]) {

'stos parmetros permiten el control so-re aspectos como el carcter o ristra a usar para emular la -ola7 el n?mero de columnas por el (ue se mover Dsta7 el tipo de implementacin para las
=

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

seales7 el tiempo de duracin de la alarma para imprimir la 3ec>a : la velocidad de la -ola 0medida en iteraciones de un -ucle1. Todos los parmetros se e*plican en detalle en el apartado Parmetros. Paso 2: )nicializaciones #na vez se >an tomado todos los parmetros7 si es (ue se >an introducido Dstos7 se proceder a la inicializacin de determinadas varia-les : seales. 'n el caso de no indicarse ciertos parmetros7 se usarn valores por de3ecto. 'n el caso de las seales7 se usar la implementacin con la 3uncin signal7 por de3ecto7 de modo (ue de-e >acerse e*pl6citamente se no se indica nada.
// Si no se han creado las seales, se usa SIGNAL por defecto

if (!senal_creada) { signal(S !"#$%, muestra_&echa); signal(S ! '(, termina); }

Puede verse como se usa la varia-le senal_creada7 (ue se inicializa a ;:


int senal_creada = 0; // Indica si se han creado las seales

i se indica al+o por parmetros se pondr a 27 de modo (ue no se tendr (ue >acer uso de la inicializacin por de3ectoC este paso7 en el cdi+o7 se encuentra antes de la inicializacin7 por(ue en ocasiones es necesario : en otras no7 en 3uncin de los parmetros de entrada.
}else if (strcmp(argv[p],")s") == 0) {
// Tipo de implementacin de seales

senal_creada = 1;

'n las inicializaciones propiamente dic>as7 se >acen dos tareas: crear e inicializar la tu-er6a o pipe7 para el control de la concurrencia 0seccin cr6tica1 : activar la alarma.
// Creacin e inicializacin del pipe

pipe(tuberia); *rite(tuberia[1], &valor, sizeof(int)); &&lush('+##);


// Alarma

alarm(tiempo_alarma);

Paso 3: Eucle de muestreo de la -ola e trata de un -ulce in3inito en el (ue se estar controlando el muestreo de la -ola : (ue en cada iteracin del -ucle la -ola se mover una posicin7 por lo +eneral una columna.
while(1) {/ !!! /}

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

Paso 3.1: Pausa entre movimientos de la -ola Para (ue el movimiento de la -ola sea ms realista7 tiene un control de velocidad con un -ucle con un n?mero de iteraciones controlado por la varia-le velocidad.
for(i=0; i<velocidad; i++);

Bo se usa la 3uncin sleep por(ue slo admite se+undos : en tal caso perdemos precisin. Pero adems7 : 3undamentalmente7 por(ue con esta 3uncin se dormir6a el proceso : se le desasi+nar6a la &P#7 lo cual no nos interesa. Paso 3.2: .over -ola 0controlando seccin cr6tica con pipe1 Para mover la -ola se >ar uso de la 3uncin printf imprimiendo cada carcter7 (ue podr ser espacios -lancos o la propia -ola7 contenida en la varia-le bola. 'ste proceso se realiza controlando la seccin cr6tica con los pipes. Para ver como se realiza el movimiento de la -ola7 -asta diri+irse al apartado Movimiento de la bola. Paso 3.3: Actualizar posicin de la -ola Tras realizar el movimiento de la -ola7 (ue se controla 3undamentalmente con la varia-le columna7 se actualiza el valor de esta varia-le : as6 en la si+uiente iteracin se pinta la -ola en la columna apropiada. $a 3orma en (ue se realiza dic>a actualizacin se e*plica en el apartado Movimiento de la bola. Parmetros 'l nom-re asi+nado al pro+rama desarrollado es alarma7 de modo (ue se e9ectur escri-iendo ./alarma desde el terminal. in em-ar+o7 tam-iDn admite parmetros7 pues se declara la 3uncin main de la si+uiente 3orma:
int main(int argn, char *argv[]) {

$os parmetros a pasar al pro+rama se indicarn mediante identi3icadores del tipo de parmetro : su valor7 de la 3oma: -TIP !P"#"M$T# V"% #!P"#"M$T# . De este modo7 el n?mero de parmetros es par7 pero como los ar+umentos (ue se reci-en inclu:en al propio nom-re del pro+rama7 sern impares. i no 3ueran impares7 se de-er6a a al+?n error7 o -ien a (ue se
A

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

pasa la opcin FFhelp7 (ue es la a:uda7 (ue indica como usar el pro+rama7 en cuanto al modo en (ue se le de-en pasar los parmetros:
if ((argn == 2) && (strcmp(argv[1],"))help") == 0)) { print&("%odo de empleo, .-alarma ./01 2'34n"); print&("4t)b bola5 $istra 6ue representa la bola4n"); print&("4t)c columna_m7xima5 1olumna m7xima a la 6ue llega la bola4n"); print&("4t)s S !'"#8S !"1( /'5 mplementaci9n de se:ales ;S !'"# por de&ecto<4n"); print&("4t)t segundos5 (iempo entre muestreo de la &echa4n"); print&("4t)v iteraciones5 =elocidad de la bola4n"); exit(0); }

$as opciones sern7 por tanto7 las si+uientes: F- -ola FFG Ristra (ue representa la -olaC si tiene espacios o caracteres especiales de-e ponerse entre comillas do-les. e contendr en la varia-le char *bola = "o";7 (ue por de3ecto valdr "o". Fc columnaHm*ima FFG &olumna m*ima a la (ue lle+a la -ola7 (ue ser de tipo entero. e contendr en la varia-le int max_columna = 40;7 (ue por de3ecto valdr 40. Fs )%BA$I )%A&T)!B FFG )ndica el tipo de implementacin de las seales7 (ue puede ser )%BA$ o )%A&T)!B. e+?n su valor se >ar uso de una u otra implementacin7 : por de3ecto )%BA$. Ft se+undos FFG Tiempo entre muestreo de la 3ec>a7 medido en se+undos7 (ue es la duracin de la alarma. e contendr en la varia-le +lo-al int tiempo_alarma = 4;7 (ue por de3ecto tiene el valor 4. Fv iteraciones FFG )ndica la velocidad de la -ola7 pero indicando el n?mero de iteraciones7 de modo (ue su valor es inversamente proporcional a la velocidad de la -ola. e contendr en la varia-le int velocidad = 30000000;7 (ue por de3ecto vale 30000000. i el n?mero de parmetros es errneo : no se trata de la opcin --help7 se tendr un error.
if ((argn%2) == 0) { print&("alarma, >orma de uso incorrecta4n"); print&("0ruebe, .-alarma ))help4n"); exit(0); }

Para tomar los parmetros7 se >ar uso de un -ucle7 en 3uncin del n?mero de parmetros7 iterando la mitad de ellos7 pues uno dice el tipo : otro el valor.
8

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.
int p; for(p=1; p<argn; p=p+2) {

David J. Horat Flotats 'nri(ue Fernndez Perdomo

'sto es necesario por(ue se desconoce el orden de los parmetros. Para cada uno de los parmetros indicados se compro-ar el tipo : lue+o se tomar su valor. i se pusiera un mismo parmetro ms de una vez7 se tomar6a el valor de la ?ltima. 'n el caso de la indicacin de la implementacin de las seales es o-li+atorio indicarlo7 de modo (ue si no se >ace7 por de3ecto se usa la implementacin )%BA$7 como :a se vio con anterioridad. Del mismo modo7 si se indica dos veces7 slo se toma la primera7 para no crear con3lictos con una do-le declaracin de las seales. &omo e9emplo podemos ver cmo se identi3ica el parmetro indicador de la ristra (ue emula la -ola7 mientras (ue el resto de parmetros pueden verse en el apartado alarma.c.
if
// "istra #ue representa la $ola

(strcmp(argv[p],")b") == 0) {

bola = argv[p+1];

Movimiento de la bola Para move la -ola7 con la 3uncin printf7 realizaremos todo el proceso del movimiento de la misma dentro de la seccin cr6tica7 controlada por los pipes7 (ue se comentan en el apartado &oluci'n a la &ecci'n (r)tica. A(u6 pasamos a comentar simplemente como se realiza el movimiento de la -ola para (ue dD la sensacin de movimiento : (ue re-ota al lle+ar a los -ordes. 'l movimiento (ue >ar la -ola consiste en estar situada en una 3ila cual(uiera : se mover por las columnas de la misma. 'n principio se mover desde la columna ; a la columna m*ima de3inida en la varia-le ma*!columna7 (ue por de3ecto vale @;. Para simular este e3ecto sin salirnos de las columnas ni saltar de la l6nea7 se usar el si+uiente al+oritmo para cada iteracin:
print&("4r"); for(i=0; i<columna; i++) print&(" "); print&(bola); for(i=columna; i<max_columna; i++) print&(" ");

$o primero es situarnos al inicio de la 3ila7 en la columna ;7 con la instruccin print&("4r");. A continuacin se realizan = pasos -astante sencillos:

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

2. Di-u9ar espacios -lancos antes de la posicin de la -ola.


for(i=0; i<columna; i++) print&(" ");

2. Di-u9ar la -ola.
print&(bola);

=. Di-u9ar espacios -lancos despuDs de la -ola pero antes de la columna m*ima7 lo cual 3unciona incluso para -olas (ue se simulen con cadenas de ms de un ?nico carcter.
for(i=columna; i<max_columna; i++) print&(" ");

Finalmente7 es mu: importante (ue se controle -ien la actualizacin de la columna en (ue se pintar la si+uiente -ola7 so-re todo para los mr+enes7 es decir7 para las columnas m6nima : m*ima. 'sto se >ace con la si+uiente l+ica al+or6tmica:
columna = columna + paso; if (columna == 1) {paso = paso; columna = 1;} if (columna == max_columna) paso = paso;

e aumenta la columna se+?n el paso7 (ue por lo +eneral slo toma dos valores7 2 F27 (ue indican el sentido (ue lleva la -ola7 es decir7 va a la derec>a o a la iz(uierda7 respectivamente. Durante el movimiento de la -ola7 Dsta podr lle+ar a la columna inicial o a la 3inal7 de modo (ue en am-os caso se modi3ica el sentido de avance7 cam-iando el si+no del paso: paso = paso;. in em-ar+o7 los caso son li+eramente di3erentes: 2. &olumna m6nima: &uando se pinta la -ola en la columna m6nima7 el paso es F27 de modo (ue al actualizar la columna7 Dsta valdr F27 de-iendo compro-arse if (columna == 1). Adems7 de-e actualizarse el valor de la columna si+uiente en la (ue de-e pintarse la -ola7 (ue de-e ser la columna 27 pues se aca-a de pintar la -ola en la columna ;. 2. &olumna m*ima: &uando se lle+a a la columna anterior a la columna m*ima : se pinta la -ola en ella7 el paso vale 2 : se actualiza la columna de 3orma (ue su valor es el de la columna m*ima. e comprue-a con if (columna == max_columna)7 : el paso pasa a ser F2. Bo se re(uiere modicar el valor de la columna7 pues su valor es el de la columna m*ima para pintar la -ola en la si+uiente iteracin : cuando se actualice la columna volver a tomar el valor de la
<

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

columna anterior a la columna m*ima. $a e9ecucin del pro+rama principal tal cual 0sin uso de seales17 proporcionar6a la si+uiente salida:
[enrique@adsl p2]$ ./alarma o

Aun(ue no puede verse7 la -ola simulado con la o se mover6a de un lado a otro re-otando en 3uncin de los mr+enes de3inidos.

Seales
'n $inu*7 los pro+ramas respondern a seales o llamadas. Kstas pueden declararse para ser atendidas por la 3uncin (ue deseemos o -ien se atendern de la 3orma por de3ecto. 'n +eneral7 cuando no se declara una seal7 Dsta se tratar por el istema !perativo : lo (ue >ar es cerrar el pro+rama. Por ello de-en declararse las seales (ue sean suscepti-les de ser reci-idas por nuestro pro+rama. Por otro lado7 la seal L)$$ es la ?nica (ue no podremos de3inir7 :a (ue de lo contrario podr6amos controlarla con una 3uncin (ue no o-li+ara a (ue nuestro pro+rama 3uese MmatadoN. Para el control de seales e*isten dos tDcnicas di3erentes: 2. Declaracin con la 3uncin si+nal. Para cada seal (ue deseemos atender7 -astar crear una 3uncin (ue lo >a+a e indicarlo de la si+uiente 3orma:
signal(S?@"#, >+'1 2');

Por e9emplo7 para la seal de alarma 0(ue tiene por valor el n?mero 2@7 contenido en la macro &I+"%#M17 (ue controlaremos con la 3uncin muestra!fecha7 >aremos uso de la si+uiente instruccin:
signal(S !"#$%, muestra_&echa);

'n el caso de la alarma tam-iDn ser necesario llamar a la 3uncin alarm7 posteriormente7 de

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

la 3orma:
alarm(tiempo_alarma);

in em-ar+o7 para la ma:or6a de seales -asta con >acer uso de la 3uncin si+nal7 nada ms. &omo consideracin adicional >a: (ue indicar (ue es recomenda-le usar las macros de los nom-res de las seales en lu+ar de los n?meros de las mismas7 pues pudieran variar sus valores numDricos de unas versiones a otras del 4ernel de $inu*. 2. 'structuras si+action. 'n este caso de-emos declarar una estructura de tipo si+action para cada seal (ue deseemos de3inir como tratar o atender.
struct sigaction senal_alarma, senal_int;

'sta 3orma es ms comple9a : tediosa (ue la declaracin con la 3uncin si+nal7 pero permite muc>o ms control. A continuacin podemos ver los principales campos de esta estructura : las 3unciones de apo:o de las mismas7 comentando la 3uncionalidad de cada una de ellas. &onsultando el man de sigaction podemos ver (ue la estructura si+action se de3ine as6:
struct sigaction { !oi" (*sa_handler)(int); !oi" (*sa_sigaction)(int, sigin&o_t *, !oi" *); sigset_t sa_masA; int sa_&lags; !oi" (*sa_restorer)(!oi"); }

'l campo ms importante es el primero7 sa!handler7 en el (ue se indica la 3uncin (ue mane9ar la seal. A continuacin se comentan los campos ms importantes7 inclu:endo Dste. 2. sa!handler: especi3ica la accin (ue se va a asociar con si+num : puede ser )%HDF$ para la accin predeterminada7 )%H)%B para no tener en cuenta la seal7 o un puntero a una 3uncin mane9adora para la seal. 2. sa!flags: especi3ica un con9unto de opciones (ue modi3ican el comportamiento del proceso de mane9o de seal. e 3orma por la aplicacin del operador de -its !R a cero o ms de las constantes (ue admite. Por de3ecto actuar de 3orma normal7 aun(ue si se desea puede asi+nrsele ;
2;

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

o -ien >acer uso de la 3uncin sigempt,set (ue se comenta ms adelante. =. sa!mas-: da una mscara de seales (ue de-er6an -lo(uearse durante la e9ecucin del mane9ador de seal. Adems7 la seal (ue lance el mane9ador ser -lo(ueada7 a menos (ue se activen las opciones ms adelante. $a 3uncin sigempt,set tiene la 3orma int sigemptBset(sigset_t *conCunto);. &on ella se inicia el con9unto de seales dado por con9unto al con9unto vac6o7 con todas las seales 3uera del con9unto. Por lo +eneral puede as+inarse ; : se o-tiene un resultado similar o -ien no >acer nada. Finalmente7 : lo ms importante para (ue la atencin a la seal ten+a e3ecto7 de-e >acerse uso de la 3uncin sigaction7 (ue tiene la si+uiente 3orma:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

AHB!D'F'R o

AHB!.A L. Por de3ecto actuar de 3orma normal7

aun(ue si se desea puede asi+nrsele ; o -ien >acer uso de la 3uncin sigempt,set (ue se comenta

$a llamada al sistema si+action se emplea para cam-iar la accin tomada por un proceso cuando reci-e una determinada seal. 'l parmetro signum especi3ica la seal : puede ser cual(uiera vlida salvo )%L)$$ o )% T!P. i act no es nulo7 la nueva accin para la seal i oldact no es nulo7 la accin anterior se +uarda en oldact. si+num se instala como act.

Por e9emplo7 en el caso de la seal de alarma7 con si+action >aremos uso de las si+uientes sentencias de inicializacin o con3i+uracin de la estructura:
senal_alarma#sa_handler = muestra_&echa; sigaction(S !"#$%, &senal_alarma, '+##);
// Accin a "ealizar

"larma .en Tiempo #eal/ 'n $inu* puede conse+uirse tiempo real7 del orden de se+undos7 con la seal o llamada A$AR.. Para ello7 usaremos cual(uiera de las dos tDcnicas antes mencionadas para la declaracin de la seal : lue+o declararemos el tiempo de la alarma con:
alarm(tiempo_alarma);

$a varia-le tiempoHalarma contiene los se+undos de duracin de la alarma7 de modo (ue el 4ernel nos enviar dic>a seal a nuestro pro+rama pasados e*actamente los se+undos indicados en
22

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

dic>a varia-le 0en tiempo real1. Ha: (ue tener en cuenta (ue esto slo indica (ue env6e dic>a seal una vez7 por lo (ue una vez se reci-a la seal : se >a+a la tarea desea7 >a-r (ue volver a indicar al 4ernel (ue nos vuelva a enviar otra seal7 volviendo a poner en el cdi+o lo mismo:
alarm(tiempo_alarma);

'sta se+unda llamada se >ar dentro del proceso de +estin de la alarma7 (ue visto al estilo del si+nal se indic de la si+uiente 3orma:
signal(S !"#$%, muestra_&echa);

&on si+action se >ar6a de la si+uiente 3orma:


struct sigaction senal_alarma; senal_alarma#sa_handler = muestra_&echa; sigaction(S !"#$%, &senal_alarma, '+##);
// Accin a "ealizar

De este modo7 la 3uncin muestra!fecha es la (ue vuelve a pedir la alarma7 una vez se >a realizado la tarea deseada en dic>a 3uncin. Interrupci'n Adicionalmente a la alarma7 como el pro+rama desarrollado es un -ucle in3inito (ue >ace un uso intensivo de la pantalla7 para poder 3inalizarlo >a: (ue enviarle la seal )%)BT7 (ue no es ms (ue escri-ir &trlO& desde el terminal en (ue se est e9ecutando el pro+rama. 'sto provoca la 3inalizacin -rusca del pro+rama7 de modo (ue >emos optado por controlar dic>a seal con la 3uncin termina7 para (ue 3inaliza mostrando un mensa9e de 3inalizacin:
!oi" termina() { print&("?l programa ha &inaliDado correctamente.4n"); exit(0); }

&on si+nal declaramos la atencin a la seal )%)BT de la si+uiente 3orma:


signal(S ! '(, termina);

.ientras (ue con si+action lo >aremos de la si+uiente 3orma:


struct sigaction senal_int; senal_int#sa_handler = termina; // Accin a "ealizar sigaction(S ! '(, &senal_int, '+##);

22

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

Lanzamiento de Procesos
0so de for'l pro+rama (ue mane9a la alarma tiene la tarea de crear un proceso (ue muestra la 3ec>a7 para lo cual >ar uso del pro+rama date7 e*istente en el sistema en la ruta /bin/date. 'sto se >ar con una de las 3unciones de tipo e*ec7 pero previamente se re(uiere (ue se cree un proceso >i9o7 (ue e9ecute la 3uncin muestra!fecha7 (ue es la (ue se llama cuando se produce la alarma7 pues al lanzar el e*ec7 el proceso desaparece : es sustituido por el proceso (ue e9ecuta el date. De este modo7 usaremos la llamada al sistema for-7 para (ue se cuando se estD e9ecutando la 3uncin muestra!fecha por el proceso principal o padre7 se cree una copia idDntica de este proceso7 pero (ue ser el proceso >i9o. 'l proceso >i9o lanzar el e*ec para (ue se e9ecute el date : muestre la 3ec>a7 mientras (ue el padre se+uir >aciendo uso del recurso pantalla7 terminando la e9ecucin de la 3uncin muestra!fecha. 'l cdi+o7 resumido7 (ue permite esto es el si+uiente:
int pid; switch (pid = &orA()) { case 1$ // for%&' falla print&("'o se pudo crear otro proceso4n"); exit(1); case 0$ // (ilo hi)o "efault$ }
/ !!! / // (ilo padre / !!! /

'n el switch se lanza el for-7 de modo (ue a partir de ese momento e*isten dos procesos7 el padre : el >i9o7 (ue son idDnticos7 pero con una li+era di3erencia: el valor de la varia-le pid vale ; para el >i9o : para el padre toma un valor ma:or (ue ;7 (ue es el identi3icador del proceso 0pid1 del >i9o. &on esta distincin7 el >i9o e9ecutar el cdi+o del case 0$7 : el padre el del "efault$. 'n el caso de (ue la 3uncin for- 3alle7 es decir7 no pueda duplicar el proceso7 devolver F2 en la varia-le pid7 : se mostrar un mensa9e de error : se a-ortar la 3uncin7 se+?n se ve en el case
1$.

2=

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

$o (ue >ace el proceso >i9o : el padre7 puede verse en la e*plicacin de las llamadas al sistema e*ec : 5aitpid7 (ue se muestran a continuacin. 0so de e*ec $a 3uncin e*ec permite lanzar un pro+rama7 pasndole ar+umentos si los tu-iere. 'sta 3uncin provoca la desaparicin del pro+rama (ue e9ecuta-a el proceso (ue lanza la 3uncin e*ec : todo su espacio de tra-a9o es ocupado por el del pro+rama llamado por la 3uncin e*ec7 es decir7 es como si el pro+rama (ue llama a e*ec muriese7 por lo (ue de-e >acer por el proceso >i9o creado con el for-7 se+?n se vi en el apartado 0so de for-. 'l cdi+o (ue e9ecutar el proceso >i9o 0el (ue est dentro del case 0$1 : (ue >ace uso de la llamada al sistema e*ecl 0(ue es una de las muc>as variantes del e*ec1 para lanzar el pro+rama date7 para (ue muestre la 3ec>a7 es 0en este caso no se muestra el control de la seccin cr6tica con pipes7 por claridad1:
execl("-bin-date","&echa",'+##);

$os parmetros de la 3uncin e*ecl7 de 3orma +enDrica son: e*ecl.P# +#"M"1 2 M3#$!P# +#"M"1 "#+41 "#+51 ...1 "#+n1 20%%/6 'sto (uiere decir (ue primero se indica el pro+rama a e9ecutar7 (ue en nuestro caso es el date7 : pasamos la ruta completa /bin/date. $ue+o se pone el nom-re del pro+rama7 (ue en principio no tiene +ran utilidad : lue+o la lista de parmetros7 (ue de-en ser de tipo char 7 0es decir7 ristras17 terminando con un 20%%C esto >ace (ue los ar+umentos 3ormen un vector de ristras7 (ue ser6a de tipo char 7argv897 (ue es el t6pico parmetro de entrada en las 3unciones main7 para tomar todos los ar+umentos7 : (ue est precidido por el parmetro int argn7 (ue indica el n?mero de ar+umentos7 inclu:endo el nom-re del pro+rama. Al e9ecutarse el e*ecl muere o desaparece el proceso >i9o7 por lo (ue ni si(uiera es necesario un brea-; al 3inal del case 0$C lo mismo ocurre si pusiDramos un e*it7 pues nunca se e9ecutar6a7 salvo (ue el e*ecl 3allara. 'l espacio de tra-a9o pasa a ser ocupado por el pro+rama date. &uando este pro+rama 3inaliza su tarea7 consistente en el muestreo de la 3ec>a7 por pantalla7 se encar+ar de
2@

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

indicar la 3inalizacin su:a :7 por tanto7 la del proceso >i9o (ue lanz el e*ecl7 (uedando indicado el estado de 3inalizacin del mismo7 ?til para la llamada al sistema 5aitpid7 (ue se ve a continuacin. 0so de :aitpid 'l proceso padre se encar+ar de ver (ue el proceso >i9o 3inaliza correctamente : en tal caso li-erar su espacio de tra-a9o7 slo cuando el >i9o >a:a terminado su tarea. $a llamada al sistema 5aitpid es la (ue permite esto. 'l cdi+o (ue e9ecutar el proceso padre7 dentro del "efault$7 ser 0o-viando el control de la seccin cr6tica con pipes1:
*aitpid(pid,&estado,E'/F"'!); alarm(tiempo_alarma);

e >a-r declarado la varia-le estado7 para reco+er el estado del proceso >i9o7 pero no ser necesario testear su valor7 pues supondremos (ue es correcto7 si -ien es necesario pasarla por re3erencia como se+undo ar+umento de la 3uncin 5aitpid. 'l primer parmetro es el identi3icador del proceso >i9o 0pid1 por el (ue de-e esperarseC tam-iDn valdr6a poner F2 para esperar por cual(uier proceso >i9o7 pero como slo >a: uno7 no tiene sentido. 'l ?ltimo parmetro es indicador del comportamiento del 5aitpid. &omo por de3ecto7 5aitpid retendr6a el proceso padre en ese punto7 lo (ue supondr6a un control intr6nseco de la seccin cr6tica7 >acemos (ue el 5aitpid no sea -lo(ueante7 con la opcin PB!HAB%. De esta 3orma7 el proceso padre si+ue su e9ecucin7 : cuando el >i9o termine7 sur+ir el e3ecto del 5aitpid7 lo cual no si+ni3ica (ue el contador de pro+rama del proceso padre vuelva poner 9usto en el 5aitpid7 sino (ue simplemente se li-erar el espacio de tra-a9o del proceso >i9o cuando Dste >a:a terminado. Por otro lado7 el proceso padre de-er volver a activar la alarma7 para (ue el 4ernel vuelva a avisarle.
alarm(tiempo_alarma);

0so de e*it $a llamada al sistema e*it es la (ue permite (ue un proceso termine7 : como parmetro permite (ue se indica un n?mero entero indicativo del estado de terminacin del proceso7 para (ue el padre pueda testear dic>o estado de 3inalizacin : actuar en consecuencia. e >ace uso del e*it7 en el case 1$7 cuando el 3or4 3alla7 mostrando un mensa9e de erro :
2A

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

3inalizando el proceso con:


exit(1);

Tam-iDn en la 3uncin termina7 (ue se llama por la seal )%)BT7 se >ace la 3inalizaicn con el e*it:
exit(0);

'n el primer caso se devuelve 27 indicando error7 mientras (ue en el se+undo caso se devuelve ;7 (ue por convenio suele ser el estado correcto de 3inalizacin de un proceso.

Control de la Seccin Crtica, con Pipes


;efinici'n de Pipe #n pipe crea un par de descriptores de 3ic>eros7 (ue apuntan a un nodoF6 de una tu-er6a7 : los pone en el vector de dos elementos apuntado por descf. As67 descf8<9 es para lectura7 descf849 es para escritura. 'sto se consi+ue 3acilmente declarando un vector de elementos : usando la 3uncin pipe:
int tuberia[2]; pipe(tuberia);

#na versin ms comple9a son las F)F! 7 o pipes con nom-re7 (ue permiten el uso de las mismas entre pro+ramas (ue no estDn relacionados7 es decir7 (ue no sean >i9os del padre en (ue se declarn : crean los pipes. Pero como en nuestro caso todos los procesos estn relacionados7 pues uno es el padre : el otro es el >i9o7 no >a-r pro-lema con el uso de los pipes. 'l primer paso7 para (ue la tu-er6a 3uncione -ien7 es inicializarla introduciendo al+o en la misma7 para (ue as6 el primer proceso (ue (uiera entrar en la seccin cr6tica pueda >acerlo7 por lo (ue prcticamente siempre se >ar se+uidamente a la creacin del pipe7 lo si+uiente:
*rite(tuberia[1], &valor, sizeof(int)); &&lush('+##);

'sta simplemente provoca la escritura en el pipe. 's necesario el uso de la 3uncin fflush para (ue las escrituras o lecturas del pipe se >a+an e3ectivas. &on B#$$ se indica (ue se escri-a en todo los 3ic>eros a-iertos7 vaciando los -u33eres de lecturaQescritura. i no se usa el fflush7 podr6an tener pro-lemas.
28

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

Aun(ue esto :a es parte del mane9o de los pipes7 a continuacin se comenta claramente como de-en mane9ar7 en3ocando dic>o mane9o al control de la seccin cr6tica como pro-lema +enDrico de pro+ramacin. Mane=o de Pipe $os pipes crean un descritor de 3ic>ero de lectura : otro de escritura7 de modo (ue podremos >acer uso de las 3unciones read : :rite para leer : escri-ir en el pipe7 respectivamente. $os descriptores ser el primer parmetro de estas dos 3unciones. 'n nuestro caso tenemos los si+uientes descriptores: 2. Descriptor de lectura FFG tuberia[0] 2. Descriptor de escritura FFG tuberia[1] Para leer del pipe usaremos:
read(tuberia[0], &valor, sizeof(int)); &&lush('+##);

Para escri-ir en el pipe usaremos:


*rite(tuberia[1], &valor, sizeof(int)); &&lush('+##);

'l 3uncionamiento del pipe es mu: simple: si no >a: nada escrito en el pipe7 al leer se -lo(uear el pro+rama >asta (ue se escri-a al+o. Por otro lado7 si se lee al+o del pipe7 Dste se vaciar. Bo o-stante7 para (ue esto 3uncione as67 es necesario (ue se escri-a : lee en i+ual cantidad7 por lo (ue se escri-e : lee simplemente el tamao de un entero 0sizeof(int)17 lo cual se indica en el tercer parmetro. Por otro lado7 aun(ue no se use para nada el valor escrito o devuelto7 Dste de-e indicarse7 (ue en nuestro caso se >ace con la varia-le valor7 pasado por re3erencia como se+undo parmetro. Adicionalmente7 simpre se >ace &&lush('+##); por se+uridad. i leemos del pipe al entrar en la seccin cr6tica7 el pipe se vaciar7 de modo (ue si otro proceso va acceder a la seccin cr6tica7 cuando lea del pipe (uedar -lo(ueado : no podr entrar en la seccin cr6tica. &uando un proceso sal+a de la seccin cr6tica7 escri-ir en el pipe7 de modo (ue los procesos -lo(ueados le:endo del pipe7 podrn entrar en la seccin cr6tica. 'l proceso (ue entrar
2J

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

ser el primero (ue lea del pipe7 por lo (ue pudiera e*istir inanicin si >a: muc>os procesos esparando por entrar en la seccin cr6tica7 pero si solo >a: un proceso esperando no e*iste inanicin7 como ocurre en nuestro caso. 'l es(ueleto de cdi+o ser6a7 por tanto7 el si+uiente:
read(tuberia[0], &valor, sizeof(int)); &&lush('+##);
/ S*CCI+N C",TICA /

*rite(tuberia[1], &valor, sizeof(int)); &&lush('+##);

'ste es(ueleto ser6a vlido : necesario para todos los procesos (ue (uiesieran entrar en la seccin cr6tica. Problema de la &ecci'n (r)tica 'n nuesto pro+rama7 el pro-lema de la seccin cr6tica es de-ido al uso de la pantalla por am-os procesos. De este modo7 lo (ue se de-e >acer es controlar (ue no escri-an los dos procesos a la vez en la pantalla7 pues en tal caso lo (ue escri-e uno : otro se entrelazar6a. Para evitar este pro-lema se >ace uso de pipes para el control de la seccin cr6tica7 (ue es el acceso o uso del recurso pantalla. $a solucin -sica es el uso del es(ueleto +enDrico visto anteriormente7 pero en el si+uiente apartado se comenta claramente como es la solucin en nuestro pro+rama7 pues di3iere li+eramente. &oluci'n a la &ecci'n (r)tica 'n el pro+rama principal o padre7 (ue >ace un uso intensivo de la pantalla7 se rodea el uso de la pantalla7 (ue es la seccin cr6tica7 por la lectura : escritura en el pipe7 teniendo el si+uiente cdi+o7 en el (ue se muestra som-reado de +ris la seccin cr6tica 0el uso de la pantalla1:
read(tuberia[0], &valor, sizeof(int)); &&lush('+##); print&("4r"); for(i=0; i<columna; i++) print&(" "); print&(bola); for(i=columna; i<max_columna; i++) print&(" "); *rite(tuberia[1], &valor, sizeof(int)); &&lush('+##);

Por su parte7 el proceso >i9o es el (ue de-e mostrar la 3ec>a7 tam-iDn por pantalla7 de modo (ue de-e usar una solucin i+ual. in em-ar+o7 >a: una di3erencia7 : es (ue el >i9o lanza el pro+rama date con la llamada al sistema e*ecl7 de modo (ue desaparece o muere. 'sto no permite (ue pueda li-erar la seccin cr6tica7 es decir7 el proceso >i9o slo podr leer del pipe para -lo(uear el
2<

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

acceso a la seccin cr6tica7 antes de lanzar el pro+rama date7 pero lue+o7 como muere7 no podr li-erar la seccin cr6tica. $a solucin se consi+ue >aciendo (ue le proceso padre se encar+ue de li-erar la seccin cr6tica. As67 el proceso padre7 9usto despuDs del 5aitpid7 li-erar la seccin cr6tica7 :a (ue el proceso >i9o no puede. A(u6 puede verse como el 5aitpid de-e no ser -lo(ueante7 es decir7 tener la opcin PB!HAB%7 pues si no7 no ser6a necesario el control de salida de la seccin cr6tica7 si -ien >a-r6a (ue >acerlo a la entrada7 como a>ora7 para (ue no imprima la 3ec>a mientras el proceso padre est imprimiendo en pantalla7 : lue+o a la salida7 despuDs del 5aitpid7 como a>ora7 para (ue el proceso principal no se -lo(uee al entrar en la seccin cr6tica. i no se usa PB!HAB%7 -asta poner ; en su lu+ar. 'l cdi+o7 por tanto7 del proceso padre e >i9o7 (ue es compartido por am-os7 si -ien uno e9ecuta una parte : el otro otra parte7 es e de la 3uncin muestra!fecha7 : es el si+uiente 0para el control de la seccin cr6tica7 mostrada som-reada de +ris1:
case 0$ // (ilo hi)o read(tuberia[0], &valor, sizeof(int)); &&lush('+##); execl("-bin-date","&echa",'+##); "efault$ // (ilo padre *aitpid(pid,&estado,E'/F"'!); *rite(tuberia[1], &valor, sizeof(int)); &&lush('+##);

Hec>o todo esto7 el pro+rama producir la si+uiente salida7 >aciendo uso de los parmetros por de3ecto7 una vez compilado : construido como se indica en el apartado (ompilaci'n , $=ecuci'n del programa .Ma-efile/.
[enrique@adsl p2]$ ./alarma o o o o mi mar 23 15:37:05 WE 2005 mi mar 23 15:37:0! WE 2005 mi mar 23 15:37:13 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e.

2/

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

Compilacin y Ejecucin del programa (Makefile)


'l pro+rama desarrollado tiene su cdi+o 3uente en el 3ic>ero alarma.c : se acompaa de un 3ic>ero Ma-efile para se compilacin7 construccin : e9ecucin ms automticaC adems de limpiar 3ic>eros creados en tales procesos. A continuacin se comenta el 3ic>ero Ma-efile7 (ue de3ine una serie de re+las (ue podrn lanzarse desde el terminal con el comando ma-e #$+%". )+ualmente se comenta como e9ecutar el pro+rama desarrollado7 as6 como el paso de parmetros al mismo.

Explicacin y Reglas del Makefile


'l 3ic>ero Ma-efile de3ine las si+uientes re+las: 2. &ompilar Tiene la 3orma:
compilar$ limpiar G;1/%0 #"H/$< G;>+?'(?S< c G;/01 /'?S<

$o primero (ue >ace es llamar a la re+la limpiar : lue+o compila el pro+rama con el &!.P)$AD!R (ue se indica7 para todos los 3ic>eros F#'BT' (ue se indi(ue : adems7 con las !P&)!B' deseadas. '*iste una re+la alias de Dsta (ue es compile. u resultado es el si+uiente:
[enrique@adsl p2]$ ma(e &ompilar rm )$ alarma.o alarma "&& alarma.& )& )Wall )" [enrique@adsl p2]$ ls alarma.& alarma.o *a(e$ile

2. &onstruir Tiene la 3orma:


construir$ compilar G;1/%0 #"H/$< G;'/%I$?<#o o G;'/%I$?<

2;

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

$o primero (ue >ace es llamar a la re+la compilar : lue+o constru:e el e9ecuta-le7 con el &!.P)$AD!R indicado : con el B!.ER' proporcionado. u resultado es el si+uiente:
[enrique@adsl p2]$ ma(e &ons'ruir rm )$ alarma.o alarma "&& alarma.& )& )Wall )" "&& alarma.o )o alarma [enrique@adsl p2]$ ls alarma alarma.& alarma.o *a(e$ile *emoria

=. '9ecutar Tiene la 3orma:


eCecutar$ construir #%G;'/%I$?< G;"$!+%?'(/S<

$o primero (ue >ace es llamar a la re+la construir : lue+o e9ecuta al pro+rama B!.ER' con los AR%#.'BT! indicados. Por norma +eneral (uerremos e9ecutar el pro+rama7 de modo (ue podemos usar directamente el comando ma-e run7 (ue producir el si+uiente resultado:
[enrique@adsl p2]$ ma(e run rm )$ alarma.o alarma "&& alarma.& )& )Wall )" "&& alarma.o )o alarma ./alarma )+ ,o, )& -0 )s ./0123 )' - )4 30000000 o o o mi mar 23 15:-1:07 WE 2005 mi mar 23 15:-1:11 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e.

Puede verse como limpia7 compila7 constru:e : e9ectua el pro+rama alarma pasando una serie de ar+umentos por de3ecto. @. $impiar Tiene la 3orma:
limpiar$ G;$%< G;/IJ?(/S< G;?J?1+("I#?S<

22

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

'l resultado de limpiar puede verse a continuacin:


[enrique@adsl p2]$ ls alarma alarma.& alarma.o *a(e$ile [enrique@adsl p2]$ ma(e &lean rm )$ alarma.o alarma [enrique@adsl p2]$ ls alarma.& *a(e$ile

implemente -orra con el comando R. los 3ic>eros !EJ'T! >a-rn creado las otras re+las. $as varia-les creadas son las si+uientes:

: 'J'&#TAE$' 7 (ue

1/%0 #"H/$ = gcc /01 /'?S = Eall & '/%I$? = alarma >+?'(?S = G;'/%I$?<#c /IJ?(/S = G;'/%I$?<#o ?J?1+("I#?S = G;'/%I$?< ( 0/_I/#" = "o" 1/#+%'"_%"K = 40 ( 0/_S !'"# = S !'"# ( ?%0/_"#"$%" = 4 =?#/1 H"H = 30000000 "$!+%?'(/S = ' G;( 0/_I/#"< c G;1/#+%'"_%"K< s G;( 0/_S !'"#<4 t G;( ?%0/_"#"$%"< v G;=?#/1 H"H< $% = r( f

$a varia-le AR%#.'BT! se compone de los ar+umentos (ue puede reci-ir el pro+rama7 (ue se e*plican en el si+uiente apartado.

E ec!cin del programa


i simplemente e9ecutamos el pro+rama con ./alarma se >ar uso de los valores por de3ectos7 (ue >a: dentro del cdi+oC en el caso del Ma-efile siempre puede alterarse modi3icando el propio 3ic>ero Ma-efile. Para tener ma:or versatilidad7 podemos >acer uso del paso de parmetros7 (ue se e*plican a continuacin7 pues de lo contrario7 por de3ecto se tomarn los si+uientes valores:
5ola 6 7o8 9olumna m:;ima 6 -0

22

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.
ipo de se<al 6 ./0123 iempo de alarma 6 =elo&idad 6 30000000

David J. Horat Flotats 'nri(ue Fernndez Perdomo

Paso de Parmetros '*isten A parmetros distintos7 a parte de la a:uda con --help. Dic>os parmetros tiene una a-reviatura para indicarlos : poner se+uidamente el valor7 de modo (ue no importa el orden de los mismos. on los si+uientes7 si -ien :a se comentaron en el apartado Parmetros. F- FFG Ristra (ue emula la -ola. Fc FFG &olumna m*ima. Fs FFG Tipo de implementacin de las seales 0con )%BA$ o con )%A&T)!B1. Ft FFG Tiempo de la alarma. Fv FFG ,elocidad de la -olaC medida de 3orma inversa7 como iteraciones de un -ucle. A continuacin se muestran al+unos e9emplos de e9ecucin: 2. .odi3icacin de la -ola 0F-1. 'n el primer caso simplemente emulamos la -ola con 77 poniendo -b >7?.
[enrique@adsl p2]$ ./alarma )+ ,>, > > mi mar 23 15:-2:21 WE 2005 > mi mar 23 15:-2:25 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e.

Ha: (ue indicar (ue el sentido de la varia-le ma*!columna 0(ue controla la columna m*ima1 es el n?mero de columnas (ue recorre el primer caracter de la ristra (ue emula la -ola7 pues as67 se mueve lo deseado7 si -ien el ?ltimo caracter de la ristra lle+ara ms all de la columna indicada por ma*!columna7 lo cual se o-servar viendo el si+uiente e9emplo7 donde la columna de escritura de la 3ec>a est ms a la derec>a7 en concreto = columnas ms all7 pues se emula la -ola con >hola?7 (ue tiene = caracteres de ms (ue la unidad.
[enrique@adsl p2]$ ./alarma )+ #ola #ola #ola mi mar 23 15:-2:-1 WE 2005 mi mar 23 15:-2:-5 WE 2005

2=

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.
#ola #ola #ola mi mar 23 15:-2:-! WE 2005 mi mar 23 15:-2:53 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

Finalmente7 recordamos (ue no son necesarias las comillas7 pero para ciertos caracteres son necesarias7 : para ristras con espacios en -lanco tam-iDn7 como se ve a continuacin:
[enrique@adsl p2]$ ./alarma )+ ,Es'a es la +ola: ?@, Es'a es la +ola: ?@ Es'a es la +ola: ?@ mi mar 23 15:--:1A WE 2005 El pro"rama #a $inali%ado &orre&'amen'e. Es'a es la +ola: ?@ mi mar 23 15:--:22 WE 2005

$os caracteres (ue re(uieren las comillas son a(uellos con un si+ni3icado especial en el terminal7 :a (ue se sustituirn por otras cadenas. Por e9emplo: R FFG indica cual(uier 3ic>eroQcarpeta7 lue+o toma el valor del primer 3ic>eroQcarpeta del directorio por orden al3a-Dtico. S FFG toma el valor del directorio de tra-a9o del usuario. 'tcDtera. 2. .odi3icacin de la columna m*ima 0Fc1. e reduce o aumenta el n?mero de columnas por los (ue se mueve la -ola7 como se ve en los si+uientes e9emplos7 en los (ue se reduce la columna m*ima a A : 27 respectivamenteC >a: (ue recordar (ue la primera columna del terminal es la ; : el valor de la columna m*ima de-e ser ma:or (ue ;7 pues de lo contrario 3allar la simulacin de la -ola re-otando.
[enrique@adsl p2]$ ./alarma )& 5 o mi mar 23 15:-B:31 WE 2005 o mi mar 23 15:-B:35 WE 2005 o mi mar 23 15:-B:3! WE 2005 o El pro"rama #a $inali%ado &orre&'amen'e. [enrique@adsl p2]$ ./alarma )& 1 o mi mar 23 15:-B:-! WE 2005 o El pro"rama #a $inali%ado &orre&'amen'e.

=. .odi3icacin del tipo se seal 0Fs1. A continuacin se muestra la e9ecucin del pro+rama usando seales implementadas con
2@

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

)%BA$ : con )%A&T)!B7 respectivamente. T se o-serva (ue el comportamiento no precesente di3erencias aparentes.
[enrique@adsl p2]$ ./alarma )s ./0123 o o o o o mi mar 23 15:-A:01 WE 2005 o mi mar 23 15:-A:05 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e. mi mar 23 15:-A:13 WE 2005 mi mar 23 15:-A:17 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e. [enrique@adsl p2]$ ./alarma )s ./029 /C1

@. .odi3icacin del tiempo de la alarma 0Ft1. i alteramos la velocidad de la alarma7 la 3recuencia con la (ue se muestra la 3ec>a var6a. As67 en los si+uientes e9emplos puede verse claramente 0se >a puesto 27 @ : J se+undos respectivamente1:
[enrique@adsl p2]$ ./alarma )' 1 o o o o o o o o o mi mar 23 15:-!:0! WE 2005 mi mar 23 15:-!:10 WE 2005 mi mar 23 15:-!:11 WE 2005 mi mar 23 15:-!:12 WE 2005 mi mar 23 15:-!:13 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e. mi mar 23 15:-!:23 WE 2005 mi mar 23 15:-!:27 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e. o mi mar 23 15:-!:3! WE 2005 o o mi mar 23 15:-!:-B WE 2005 El pro"rama #a $inali%ado &orre&'amen'e.

[enrique@adsl p2]$ ./alarma )' -

[enrique@adsl p2]$ ./alarma )' 7

A. .odi3icacin de la velocidad de la -ola 0Fv1. $a velocidad de la -ola no puede apreciarse en las si+uientes capturas7 pero si pueden comentarse al+unas conclusiones7 aun(ue Dstas tam-iDn dependern de la m(uina en (ue se e9ecute el pro+rama.

2A

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.
[enrique@adsl p2]$ ./alarma )4 0 o o o mi mar 23 15:50:1A WE 2005 El pro"rama #a $inali%ado &orre&'amen'e. mi mar 23 15:50:3! WE 2005 o El pro"rama #a $inali%ado &orre&'amen'e. [enrique@adsl p2]$ ./alarma )4 3000000 o o o o mi mar 23 15:50:55 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e. mi mar 23 15:51:01 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

[enrique@adsl p2]$ ./alarma )4 1000000

[enrique@adsl p2]$ ./alarma )4 30000000

&on ; se tiene la velocidad ms rpida : con =;;;;;;; la ms lenta7 en la cual se aprecian saltos. &on =;;;;;; se ve un movimiento 3luido : rpido pero ms o menos percepti-le. Al+unos e9emplos ms7 de e9ecucin7 >aciendo uso de com-inaciones de parmetros7 se muestran a continuacin: 2. '9emplo 2 e pone un tiempo de alarma de 2 se+undo 0-t 417 una velocidad de la -ola rpida pero percepti-le 0-v @<<<<<<1 : se emula la -ola con el carcter A.
[enrique@adsl p2]$ ./alarma )' 1 )4 3000000 )+ D D mi mar 23 15:53:5B WE 2005 D D D D D D mi mar 23 15:53:57 WE 2005 D mi mar 23 15:53:5A WE 2005 mi mar 23 15:53:5! WE 2005 mi mar 23 15:5-:00 WE 2005 mi mar 23 15:5-:01 WE 2005 mi mar 23 15:5-:02 WE 2005 El pro"rama #a $inali%ado &orre&'amen'e.

2. '9emplo 2 e pone un tiempo de alarma de 2 se+undo 0-t 417 una velocidad de la -ola rpida pero percepti-le 0-v @<<<<<<17 se emula la -ola con la ristra >;& ? : se limita la columna m*ima a la =7 de modo (ue el primer carcter (ue emula la -ola 0;1 slo podr lle+ar a la columna = como
28

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

m*ima 0podr estar en las columnas ;7 27 2 : =1C : el ?ltimo carcter 0 1 podr lle+ar a la columna A7 pues la ristra tiene 2 caracteres ms (ue la unidad 0= O 2 U A1.
[enrique@adsl p2]$ ./alarma )' 1 )4 3000000 )+ ,E.C, )& 3 E.C mi mar 23 15:5B:11 WE 2005 E.C mi mar 23 15:5B:12 WE 2005 E.C mi mar 23 15:5B:13 WE 2005 E.C mi mar 23 15:5B:1- WE 2005 E.C mi mar 23 15:5B:1B WE 2005 E.C mi mar 23 15:5B:1B WE 2005 E.C mi mar 23 15:5B:17 WE 2005 E.CEl pro"rama #a $inali%ado &orre&'amen'e.

2J

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

Anexo Cdigo Fuen e


alarma"c
)inclu"e <s*s%t*+es#h, Linclude <sBs-*ait.h> Linclude <stdio.h> Linclude <stdlib.h> Linclude <signal.h> Linclude <unistd.h> Linclude <string.h> int tuberia[2], tiempo_alarma = 4; !oi" muestra_&echa() { int pid, estado, valor; switch (pid = &orA()) { case 1$ // for%&' falla print&("'o se pudo crear otro proceso4n"); exit(1); case 0$ // (ilo hi)o read(tuberia[0], &valor, sizeof(int)); &&lush('+##); execl("-bin-date","&echa",'+##); "efault$ // (ilo padre
// /ermite li$erar el hilo hi)o del 0r$ol de procesos // Imprime fecha con el pro-rama date &controlando seccin cr.tica con pipe'

*aitpid(pid,&estado,E'/F"'!); *rite(tuberia[1], &valor, sizeof(int)); &&lush('+##); alarm(tiempo_alarma);

!oi" termina() { print&("?l programa ha &inaliDado correctamente.4n"); exit(0); } int main(int argn, char *argv[]) { int columna = 0, max_columna = 40, paso = 1, velocidad = 30000000, valor, i; int senal_creada = 0; // Indica si se han creado las seales char *bola = "o"; struct sigaction senal_alarma, senal_int;
// /AS1 23 /ar0metros de entrada // A4uda &55help'

if ((argn == 2) && (strcmp(argv[1],"))help") == 0)) { print&("%odo de empleo, .-alarma ./01 2'34n"); print&("4t)b bola5 $istra 6ue representa la bola4n"); print&("4t)c columna_m7xima5 1olumna m7xima a la 6ue llega la bola4n"); print&("4t)s S !'"#8S !"1( /'5 mplementaci9n de se:ales ;S !'"# por de&ecto<4n"); print&("4t)t segundos5 (iempo entre muestreo de la &echa4n");

2<

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.
print&("4t)v iteraciones5 =elocidad de la bola4n"); exit(0);

David J. Horat Flotats 'nri(ue Fernndez Perdomo

// 6so Incorrecto

if ((argn%2) == 0) { print&("alarma, >orma de uso incorrecta4n"); print&("0ruebe, .-alarma ))help4n"); exit(0); }


// Toma de /ar0metros

int p; for(p=1; p<argn; p=p+2) { if (strcmp(argv[p],")b") == 0) { bola = argv[p+1]; }else if (strcmp(argv[p],")c") == 0) { max_columna = atoi(argv[p+1]); }else if ((strcmp(argv[p],")s") == 0) && (!senal_creada)) { senal_creada = 1; if ((strcmp(argv[p+1],"S !'"#") == 0)) { signal(S !"#$%, muestra_&echa); signal(S ! '(, termina); }else { senal_alarma#sa_handler = muestra_&echa; // Accin a "ealizar sigaction(S !"#$%, &senal_alarma, '+##); senal_int#sa_handler = termina; // Accin a "ealizar sigaction(S ! '(, &senal_int, '+##); } }else if (strcmp(argv[p],")t") == 0) { tiempo_alarma = atoi(argv[p+1]); }else if (strcmp(argv[p],")v") == 0) { velocidad = atoi(argv[p+1]); }else{
// 6so Incorrecto // 8elocidad de la $ola // Tiempo entre muestreo de la fecha &alarma' // Tipo de implementacin de seales // Columna m07ima a la #ue lle-a la $ola // "istra #ue representa la $ola

print&("alarma, >orma de uso incorrecta4n"); print&("0ruebe, .-alarma ))help4n"); exit(0);

// Si no se han creado las seales, se usa SIGNAL por defecto

if (!senal_creada) { signal(S !"#$%, muestra_&echa); signal(S ! '(, termina); }


// /AS1 93 Inicializaciones // Creacin e inicializacin del pipe

pipe(tuberia); *rite(tuberia[1], &valor, sizeof(int)); &&lush('+##);


// Alarma

alarm(tiempo_alarma);

2/

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.

David J. Horat Flotats 'nri(ue Fernndez Perdomo

// /AS1 :3 ;ucle de muestreo de la $ola

while(1) {

// /AS1 :!23 /ausa entre mo<imientos de la $ola // &sleep&2', solo funciona para se-undos enteros'

for(i=0; i<velocidad; i++);

// /AS1 :!93 =o<er $ola &controlando seccin cr.tica con pipe'

read(tuberia[0], &valor, sizeof(int)); &&lush('+##); print&("4r"); for(i=0; i<columna; i++) print&(" "); print&(bola); for(i=columna; i<max_columna; i++) print&(" "); *rite(tuberia[1], &valor, sizeof(int)); &&lush('+##);
// /AS1 :!:3 Actualizar posicin de la $ola

columna = columna + paso; if (columna == 1) {paso = paso; columna = 1;} if (columna == max_columna) paso = paso;

Makefile
>>>>>>>>>>>>> > 8aria$les > >>>>>>>>>>>>>

1/%0 #"H/$ = gcc /01 /'?S = Eall & '/%I$? = alarma >+?'(?S = G;'/%I$?<#c /IJ?(/S = G;'/%I$?<#o ?J?1+("I#?S = G;'/%I$?< ( 0/_I/#" = "o" 1/#+%'"_%"K = 40 ( 0/_S !'"# = S !'"# ( ?%0/_"#"$%" = 4 =?#/1 H"H = 30000000 "$!+%?'(/S = ' G;( 0/_I/#"< c G;1/#+%'"_%"K< s G;( 0/_S !'"#<4 t G;( ?%0/_"#"$%"< v G;=?#/1 H"H< $% = r( f
>>>>>>>>>> > "e-las > >>>>>>>>>>

compilar$ limpiar G;1/%0 #"H/$< G;>+?'(?S< c G;/01 /'?S< construir$ compilar G;1/%0 #"H/$< G;'/%I$?<#o o G;'/%I$?<

=;

Prctica 2: Realizacin de una Alarma Temporizada Diseo de istemas !perativos " #.$.P.%.&.
eCecutar$ construir #%G;'/%I$?< G;"$!+%?'(/S< limpiar$ G;$%< G;/IJ?(/S< G;?J?1+("I#?S<
>>>>>>>>>>>>>>>>>>>> > "e-las en In-l?s > >>>>>>>>>>>>>>>>>>>>

David J. Horat Flotats 'nri(ue Fernndez Perdomo

compile$ compilar build$ construir run$ eCecutar clean$ limpiar

=2