Sie sind auf Seite 1von 6

Administracin de Sistemas Operativos

Fecha: 04/06/2009
Sala: Lab C-307

Laboratorio 2: Seales
Objetivos:
Demostrar el uso de seales entre procesos

Requerimientos:
Computador con acceso a sistema operativo Unix.
Estacin de trabajo Windows con entorno VMWare, con una mquina virtual Linux 2.6.18-8.el5
GNU/Linux

Sintaxis:
Los textos en formato Courier New corresponden a entradas o salidas en el computador.

1. Referencias
Para enviar una seal
kill (process_number, signal_number) from C,
kill -signal_number process_number from Shell.
Y al recibir una seal, el tratamiento puede ser:

Ignorar la seal
Tratamiento por defecto
Tratamiento especfico

signal(signal_number,SIG_IGN)
signal(signal_number,SIG_DFL)
signal(signal_number,function)

Referirse a /usr/include/sys/signal.h o/usr/include/sys/iso/signal_iso.h para ver una lista de las seales

Comportamiento de un proceso
#include <signal.h>
void main(void)
{
while(1); /* Esperar seales*/
}

root# ./lab2
<Ctrl-C>
root#

root# ps axl
2456
./lab2
root# kill -2 2456

Administracin de Sistemas Operativos


Fecha: 04/06/2009
Sala: Lab C-307

2. Ignorar todas las seales

Escribir un programa que ignore todas las seales. Tomar como referencia el siguiente cdigo:
#include <signal.h>
void main(void)
{
int Nb_Sig ;
long ValSig;
for (Nb_Sig = 1; Nb_Sig < NSIG ; Nb_Sig ++)
{
ValSig=signal(Nb_Sig,SIG_IGN);
printf("Valor retornado para: %d.-> %d\n", Nb_Sig,ValSig);
}
while(1); /* Esperar seales*/
}

root# ./lab2
<Ctrl-C>
<Ctrl-C>
<Ctrl-C>
<Ctrl-C>
root#

root# ps -axl
2456
./lab2
#se ignora
root# kill -2 2456
root# kill -9 2456
#se cancela

Probar el valor de retorno de la funcin "signal" para identificar las seales especiales que no
pueden ser ignoradas. Referirse a /usr/include/sys/iso/signal_iso.h para identificar la
funcin de la seal para cada valor de Nb_Sig).
Presionar <CTRL-C> en la ventana del proceso. Enviar seales a este proceso usando kill desde
otras ventanas. Confirmar si SIGKILL, con nmero de seal 9, termina el proceso.

Administracin de Sistemas Operativos


Fecha: 04/06/2009
Sala: Lab C-307

3. Tratamientos especficos de seales


Modificar el programa anterior para ejecutar la funcin Tratar_sig al recibir una seal
Tomar como referencia el siguiente cdigo:
#include <signal.h>
void main(void)
{
void Tratar_Sig (int Numero);
int Nb_Sig ;
long ValSig;
for (Nb_Sig = 1; Nb_Sig < NSIG ; Nb_Sig ++)
{
ValSig=signal(Nb_Sig,Tratar_Sig);
printf("Valor retornado para: %d.-> %d\n", Nb_Sig,ValSig);
}
while(1); /* Esperar seales */
}
/************* Funcin de tratamiento **************/
void Tratar_Sig (int Numero)
{
printf("Hola. Seal recibida %d !\n", Numero);
signal(Numero,Tratar_Sig);
# No es necesario en Centos
}
Al igual que en el caso anterior verificar el comportamiento al enviar seales al proceso
Tomar en cuenta que los sistemas operativos UNIX Berkeley tales como el Solaris, es necesario
volver a aplicar el tratamiento de la seal, llamando a la funcin signal inmediatamente despus
de recibir la seal, por ejemplo dentro de la rutina de tratamiento especfico, en caso contrario se
readopta el tratamiento por defecto. Esto no es necesario en las versiones de UNIX System V, ej.
Linux.

Administracin de Sistemas Operativos


Fecha: 04/06/2009
Sala: Lab C-307

4. Tratamiento de la seal SIGFPE


Implementar una funcin que se ejecute al recibir la seal SIGFPE.
Tomar como referencia el siguiente cdigo:

/*********** SIGFPE specific treatment ***************/


#include <stdio.h>
#include <signal.h>
void main(void)
{
void Traite_FPE (int Num);
int b;
//***
signal(SIGFPE, Tratar_FPE);
//***
while (1)
{
//***
/* trigger a SIGFPE signal for example by dividing and integer
by zero */
b=b/0;
}
}
/*********** Tratamiento de seal SIGFPE ********/
void Tratar_FPE (int Num)
{
printf("Pid %d recibe seal %d\n", getpid(), Num);
***
}

Confirmar la ejecucin de la function Tratar_FPE cuando se presente un error de punto flotante.


Emplear las instrucciones setjmp y longjmp para reanudar la ejecucin antes de la instruccin
while cuando ocurre el error. Usar man setjmp para ver mas detalles sobre el uso de la funcin.
El segundo parmetro de la instruccin longimp debe ser el valor retornado por la instruccin
setjmp previa.

5. Tratamiento de la seal SIGUSR1 y SIGUSR2


Escriba un programa que realice las siguientes tareas:
Muestre el numero del proceso (pid) usando getpid()
Que procese todas las seales mediante una funcin func que nicamente muestre el nmero de
la seal recibida
Que procese la seal SIGUSR1 mediante la funcin func1 y la seal SIGUSR2 mediante la
funcin func2
func1 debe mostrar el nmero de la seal recibida y la lista de usuarios (usando "who")
func2 debe mostrar el nmero de la seal recibida y el espacio de disco (usando df)

Administracin de Sistemas Operativos


Fecha: 04/06/2009
Sala: Lab C-307

Iniciar el programa y enviarle las seales SIGUSR1 y SIGUSR2 desde otras ventanas usando kill.
Tomar como referencia el siguiente cdigo:

#include <signal.h>
void main (void)
{
***
/* Poner aqu el tratamiento para todas las seales */
/* excepto SIGUSR1,SIGUSR2
*/
void func (int Numero);
void func1 (int Numero);
void func1 (int Numero);
int Nb_Sig ;
long ValSig;
for (Nb_Sig = 1; Nb_Sig < NSIG ; Nb_Sig ++)
{
ValSig=signal(Nb_Sig,func);
printf("Valor retornado para: %d.-> %d\n", Nb_Sig,ValSig);
}
/* Poner aqu el tratamiento para SIGUSR1 y SIGUSR2 */
signal(SIGUSR1, func1);
signal(SIGUSR2, func2);
while (1); /* esperar por la seales */
}
/*************** function func **************/
void func (int Numero)
{
printf("Func: Pid %d recibe seal %d\n", getpid(), Numero);
}
/*************** func1 function **************/
void func1 (int Numero)
{
printf("Func1: Pid %d recibe seal %d\n", getpid(), Numero);
}
/*************** func2 function **************/
void func2 (int Numero)
{
printf("Func2: Pid %d recibe seal %d\n", getpid(), Numero);
}

Administracin de Sistemas Operativos


Fecha: 04/06/2009
Sala: Lab C-307

6. Opcional
Implementar el siguiente cdigo para mostrar un mensaje en pantalla cada 5 segundos a menos que se
presione una tecla:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main(void)
{
void Tratar_sig(int Signal);
int Caracter;
signal(SIGALRM, Tratar_sig);
alarm(5);
do
{
Caracter=getchar();
putchar(Caracter);
alarm(5);
} while(Caracter != EOF);
/* CTRL-D para salir */
}
/***********************************************/
void Tratar_sig(Signal)
{
printf("\n\n Ingrese un caracter!: ");
signal(Signal, Tratar_sig);
alarm(5);
}

Das könnte Ihnen auch gefallen