Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Practicas de Sistemas operativos
David Arroyo Guardeno
Escuela Politecnica Superior de la Universidad Autonoma de Madrid
Quinta semana: senales
1 Cronograma semanal2 Entregas3 Introduccion4 Envıo de senales5 Tratamiento de senales
Ejemplo 1Ejemplo2Ejemplo3Ejemplo4Ejemplo 5Ejemplo 5Ejemplo 6
6 Referencias
Segunda practica
1 Hilos: ejercicios 3 y 42 Senales: ejercicios 6, 8 y 10
☠☠ Jueves 5 de marzo
Entregas
☠ Ejercicio3☠ Ejercicio 4
¿Que es una senal?3 Notificacion que recibe un proceso sobre la ocurrencia de un evento:
Interrupcion software
Programa principal Ejecucion normal Kernel Manejador de senal
inicio programa
Llega senal
Llamada al manejador
instruccion m
return: vuelve a la instruccion m+1
Ejecucion del codigo del manejador de senalEjecucion del codigo del manejador de senal
Ejecucion normal
exit()
Recepcion de una senal: posibles efectos I
3 La senal es ignorada: el kernel ladescarta→ no efecto sobre el proceso
3 El proceso es eliminado (killed)∼ Abnormal process termination7 Terminacion normal: exit()
3 Se genera un fichero core dump y setermina el proceso
3 Imagen de la memoria virtual del proceso⇒ Posterior depuracion
3 Se para el proceso (stopped): proceso ensuspension
Recepcion de una senal: posibles efectos II
3 Se restablece el proceso (resumed) alestado previo a su suspension
Configurar la respuesta de un proceso auna senal: setting the disposition of a
signal
Ø Se ejecuta la accion por defectoØ La senal es ignoradaØ Se usa una rutina especıfica que hace las
veces de manejador de senal
¿Que es un manejador de una senal(signal handler)?
3 Una funcion creada por el programador para generar unarespuesta determinada cuando se produce un cierto evento
⇒ Shell: Control−C → SIGINT→ para el proceso enejecucion y se vuelve al bucle de entrada principal (promptde la shell)
3 Instalar o establecer un manejador de senal
7 Notificacion al kernel del programa a ejecutar en caso deque se reciba la senal relativa
Ø Ejecucion del manejador tras recibir la senal
7 La senal esta siendo tratada, manejada (handled) ocapturada (caught)
Envıo de senales#include <s i g n a l . h>i n t k i l l ( p i d t pid , i n t s ig ) ;
Ø pid > 0→ proceso al que enviamos la senal
Ø pid = 0→ la senal se envıa a todos los procesos ∈ mismogrupo
Ø pid =−1→ se envıa a todos los procesos | identificador real= identificador efectivo del proceso que la envıa
Ø pid <−1→ procesos identificador de grupo = valorabsoluto de pid
u i d t ge tu id ( void ) ;u i d t geteu id ( void ) ;g i d t ge tg id ( void ) ;g i d t geteg id ( void ) ;i n t se tpg id ( p i d t pid , p i d t pgid ) ;p i d t getpg id ( p i d t p id ) ;i n t setpgrp ( void ) ;p i d t getpgrp ( void ) ;
Tratamiento de senales
#include <s i g n a l . h>void (∗ s i g n a l ( i n t sig , void (∗ handler ) ( i n t ) ) ) ( i n t ) ;
#include <s i g n a l . h>typedef void (∗ s i g h a n d l e r t ) ( i n t ) ;s i g h a n d l e r t s i g n a l ( i n t signum , s i g h a n d l e r t handler ) ;
Ejemplo 1#include <s t d i o . h>#include <s i g n a l . h>#include <s t d l i b . h>
i n t main ( i n t argc , char ∗argv [ ] , char ∗env [ ] ){
void manejador SIGINT ( ) ;
i f ( s i g n a l ( SIGINT , manejador SIGINT ) ==SIG ERR) {pe r ro r ( ” s i g n a l ” ) ;e x i t ( EXIT FAILURE ) ;
}while ( 1 ) {
p r i n t f ( ”En espera de C t r l +C\n ” ) ;s leep (100) ;
}}
void manejador SIGINT ( i n t s ig ){
p r i n t f ( ” Senal numero %d r e c i b i d a \n ” , s ig ) ;}
Ø stty -aØ man stty
Ejemplo2#include <un is td . h>#include <s i g n a l . h>#include <sys / wa i t . h>#include <s t d i o . h>#define NUM HIJOS 3/∗ Handle SIGCHLD s igna l s . ∗ /void hand le s igch ld ( i n t s ig ) {
p i d t p id ;i n t s ta tus ;
p id = wa i t (& s ta tus ) ;
p r i n t f ( ” H i j o to ta lmente e l iminado %d\n ” , p id ) ;s leep ( 1 ) ;
}
i n t main ( ) {i n t i ;s i g n a l (SIGCHLD, hand le s igch ld ) ;
for ( i =0; i < NUM HIJOS ; i ++){i f ( f o r k ( ) ==0){
p r i n t f ( ” Desde e l h i j o , hola %d\n ” , ge tp id ( ) ) ;s leep ( 5 ) ;return 0;
}}
while ( i ) {pause ( ) ;
}
return 0;}
Ejemplo3 I#include <un is td . h>#include <s i g n a l . h>#include <sys / wa i t . h>#include <s t d i o . h>#include <s t d l i b . h>#define NUM HIJOS 3/∗ Handle SIGCHLD s igna l s . ∗ /void hand le s igch ld ( i n t s ig ) {
p i d t p id ;i n t s ta tus ;
while ( 1 ) {p id = wa i t p i d (−1,& sta tus ,WNOHANG) ;i f ( pid <=0) /∗Ya no hay zombies ∗ /
break ;/∗En l a p rac t i ca , se debe e v i t a r imp r im i r . . . ∗ /p r i n t f ( ” H i j o to ta lmente e l iminado %d\n ” , p id ) ;
}sleep ( 1 ) ;
}
i n t main ( ) {
Ejemplo3 II
i n t i ;s i g n a l (SIGCHLD, hand le s igch ld ) ;
for ( i =0; i < NUM HIJOS ; i ++){i f ( f o r k ( ) ==0){
p r i n t f ( ” Desde e l h i j o , hola %d\n ” , ge tp id ( ) ) ;s leep ( 5 ) ;e x i t (EXIT SUCCESS) ;
}}
while ( 1 ) {pause ( ) ;
}return 0;
}
Ejemplo 4#include <s t d i o . h>#include <s t d l i b . h>#include <un is td . h>#include <math . h>#include <s i g n a l . h>
i n t main ( i n t argc , char ∗argv [ ] ) {s i g s e t t intmask ;
s igemptyset (& intmask ) ;s igaddset (& intmask , SIGINT ) ;while ( 1 ) {
sigprocmask (SIG BLOCK , &intmask ,NULL) ;p r i n t f ( ” senal SIGINT bloqueada\n ” ) ;s leep (10) ;p r i n t f ( ” 10 segundos con senal bloqueada\n ” ) ;sigprocmask (SIG UNBLOCK, &intmask , NULL) ;p r i n t f ( ” senal SIGINT desbloqueada\n ” ) ;s leep (10) ;p r i n t f ( ” 5 segundos con senal desbloqueada\n ” ) ;
}return EXIT SUCESS ;
}
Ejemplo 5i n t i n te r rump ido ;void in ter rumpe ( i n t d ) {
i n te r rump ido = 1;}void mata ( char ∗s ) {
p r i n t f ( ”%s\n ” , s ) ;e x i t (EXIT SUCCESS) ;
}i n t main ( ) {
struct s i g a c t i o n sa ; i n t n ; char c ;
sa . sa handler = in ter rumpe ; s igemptyset (&sa . sa mask ) ; sa . s a f l a g s =0;
i f ( s i g a c t i o n ( SIGINT , &sa , NULL) )mata ( ” s igac t i on−SIGINT ” ) ;
sa . s a f l a g s = SA RESTART;i f ( s i g a c t i o n ( SIGQUIT , &sa , NULL) )
mata ( ” s igac t i on−SIGQUIT ” ) ;
i n te r rump ido = 0;n = read (0 , &c , 1) ;i f ( n == −1 && errno == EINTR)
p r i n t f ( ” read c a l l was i n t e r r u p t e d \n ” ) ;else i f ( i n te r rump ido )
p r i n t f ( ” read c a l l was res ta r ted , c=%c\n ” , c ) ;return 0;
}
Ejemplo 6 Ivoid imprime mascara ( ){
s i g s e t t s i g s e t ;i n t errno save ;
errno save = errno ;i f ( sigprocmask (0 , NULL, &s i g s e t ) < 0)
pe r ro r ( ” Sigprocmask ” ) ;p r i n t f ( ” sigmask = ” ) ;i f ( sigismember (& s igse t , SIGINT ) ) p r i n t f ( ” SIGINT ” ) ;i f ( sigismember (& s igse t , SIGQUIT ) ) p r i n t f ( ” SIGQUIT ” ) ;i f ( sigismember (& s igse t , SIGUSR1) ) p r i n t f ( ”SIGUSR1 ” ) ;i f ( sigismember (& s igse t , SIGUSR2) ) p r i n t f ( ”SIGUSR2 ” ) ;i f ( sigismember (& s igse t , SIGALRM) ) p r i n t f ( ”SIGALARM ” ) ;i f ( sigismember (& s igse t , SIGABRT) ) p r i n t f ( ”SIGABRT ” ) ;i f ( sigismember (& s igse t , SIGCHLD) ) p r i n t f ( ”SIGCHLD ” ) ;i f ( sigismember (& s igse t , SIGHUP) ) p r i n t f ( ”SIGHUP ” ) ;i f ( sigismember (& s igse t , SIGTERM) ) p r i n t f ( ”SIGTERM ” ) ;p r i n t f ( ” \n ” ) ;er rno = errno save ;
}
i n t main ( ) {s i g s e t t mascara ;
Ejemplo 6 II
s i g s e t t mascara ant igua ;
s igemptyset (&mascara ) ;s igaddset (&mascara , SIGQUIT ) ;s igaddset (&mascara , SIGUSR2) ;sigprocmask (SIG BLOCK , &mascara , &mascara ant igua ) ;imprime mascara ( ) ;while ( 1 ) pause ( ) ;
}
Referencias
⇒ Francisco M. Marquez. Unix,Programacion Avanzada. Editorial:Ra-Ma. 3a Edicion. ISBN: 84-7897-603-5