Académique Documents
Professionnel Documents
Culture Documents
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)
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
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.
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);
}
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);
}