21
Pr· acticas de Sistemas operativo David Arroyo Guardeno Escuela Polit· ecnica Superior de la Universidad Aut· onoma de Madrid Quinta semana: senales

Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include int k i l l ( pid t pid , int sig ) ; Ø pid

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

Practicas de Sistemas operativos

David Arroyo Guardeno

Escuela Politecnica Superior de la Universidad Autonoma de Madrid

Quinta semana: senales

Page 2: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

1 Cronograma semanal2 Entregas3 Introduccion4 Envıo de senales5 Tratamiento de senales

Ejemplo 1Ejemplo2Ejemplo3Ejemplo4Ejemplo 5Ejemplo 5Ejemplo 6

6 Referencias

Page 3: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

Segunda practica

1 Hilos: ejercicios 3 y 42 Senales: ejercicios 6, 8 y 10

☠☠ Jueves 5 de marzo

Page 4: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

Entregas

☠ Ejercicio3☠ Ejercicio 4

Page 5: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

¿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()

Page 6: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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

Page 7: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

Recepcion de una senal: posibles efectos II

3 Se restablece el proceso (resumed) alestado previo a su suspension

Page 8: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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

Page 9: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

¿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)

Page 10: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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 ) ;

Page 11: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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 ) ;

Page 12: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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 ) ;}

Page 13: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

Ø stty -aØ man stty

Page 14: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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;}

Page 15: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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 ( ) {

Page 16: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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;

}

Page 17: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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 ;

}

Page 18: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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;

}

Page 19: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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 ;

Page 20: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

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 ( ) ;

}

Page 21: Prácticas de Sistemas operativosarantxa.ii.uam.es/~darroyo/s5.pdf · 2015-02-26 · Env´ıo de senales˜ #include  int k i l l ( pid t pid , int sig ) ; Ø pid

Referencias

⇒ Francisco M. Marquez. Unix,Programacion Avanzada. Editorial:Ra-Ma. 3a Edicion. ISBN: 84-7897-603-5