Professional Documents
Culture Documents
U id d Temática
Unidad T áti 3
Llamadas al sistema:
Señales
Sis#3m@s 2
Op3r@#iv0s
@ i
Equipo docente de
“Sistemas Operativos DISCA/DSIC”
Universidad Politécnica de Valencia
Llamadas al sistema
Índice
– Señales
S02 Sistemees operaatius II
Bibliografía
“UNIX Programación
P ió Práctica”.
P á ti ” Kay
K A Robbins,
A. R bbi St
Steven
Robbins. Prentice Hall. ISBN 968-880-959-4. Capítulo 5.
Pá i
Páginas d manuall de
de d cualquier
l i distribución
di t ib ió Linux.
Li
Documentación del estándar POSIX. (http://sop.upv.es/posix)
S
Señales
Motivación
– ¿Como puede manejar un s.o. las siguientes situaciones anormales?
Un programa que no acaba nunca y se quiere interrumpir...
Un programa que realiza un error no previsto y provoca una excepción, como p.e.:
– Un error matemático: división por cero, etc.
S02 Sistemees operaatius II
Solució
– Disponer de un mecanismo para poder actuar sobre un programa en ejecución
e interrumpirlo Æ Señal
El efecto, en la mayoría de casos, ha de ser eliminar el proceso, aunque en otros
S
puede
d interesar
i t manejarla.
j l
Señales
Concepto
– Evento que interrumpe la ejecución normal de un proceso
– La acción por defecto es matar el proceso
– Pueden manejarse
S02 Sistemees operaatius II
Máscara de P1
Proceso P1
Ejecución normal
manejador
S
Señales
Generación Máscara Manejo
de señales de señales de señales
Se ejecuta el
manejador(...)
manejador
S02 Sistemees operaatius II
SIG_IGN Se ignora
.
. Acción de
. SIG_DFL defecto
(exit: mata el
. proceso)
.
Definición máscara .
• Terminal
• Errores sigemptyset(...)
• Software g
sigfillset(..) Establecer manejador
sigaddset(..)
kill(...) sigaction(...)
sigdelset(..)
alarm(..) Espera de señales
sigismemeber(...)
S
Señales
Señales
kill Enviar una señal
alarm
l G
Generar una alarma
l ((señal
ñ ldde reloj)
l j)
S02 Sistemees operaatius II
sigfillset Iniciar una máscara para que contenga todas las señales
sigaddset
i dd P
Poner una señal
ñ l específica
ífi en un conjunto
j t d de señales
ñ l
sigprocmask
i k Examinar/modificar
/ f máscara de señales
Lista de señales
Nº Señal Descripción DFL.
1 SIGHUP Colgado/muerte terminal control exit
2 SIGINT CTRL-C de teclado (interrupción) exit
S02 Sistemees operaatius II
Señales
$ fg %1
cat > text
Señales
int kill(pid_t
kill(pid t pid,
pid int sig)
S02 Sistemees operaatius II
Descripción
p
– Envía la señal sig al proceso o grupo de procesos pid.
– Si pid==0 la señal se envía al grupo de procesos del emisor (excepto a sí
mismo)
– Si pid==-1 y el EUID del que envía es root, la señal se envía a todos los
procesos excepto
p p los del sistema
– El EUID del proceso que envía la señal debe coincidir con el EUID del que la
recibe o ser root.
S
Señales
kill
Valor de retorno
– 0 si la señal es enviada y –1 si error.
Errores
S02 Sistemees operaatius II
Descripción
– Programa la señal SIGALRM para que ocurra al cabo de un cierto número de
segundos (seconds).
– Un p
proceso solo ppuede tener una p
petición de alarma p
pendiente. Las ppeticiones
sucesivas de alarmas no se encolan, cada nueva petición anula la anterior.
– alarm(0) cancela todas las alarmas pendientes
Valor de retorno
– Tiempo restante para que venciese la alarma anterior.
S
Señales
Descripción
– sigemptyset: inicia una máscara para que no tenga señales seleccionadas
– sigfillset: inicia una máscara para que contenga todas las señales
– sigaddset:
i dd pone una señal
ñ l específica
ífi en un conjunto
j t ded señales
ñ l
– sigdelset: quita una señal específica de un conjunto de señales
– sigismember: consulta si una señal pertenece a un cto. de señales
S
Señales
Máscara de señales
– Les funciones anteriores constituyen una biblioteca para manipular una variable
de nivel de usuario donde se define la máscara como un mapa de bits. El
sistema operativo no se apercibe de estas operaciones.
– P
Posteriormente,
t i t hay
h que hacer
h efectiva
f ti l máscara:
la á comunicarle
i l all núcleo
ú l l
la
S02 Sistemees operaatius II
sigemptyset
P1 (1) sigfillset
sigaddset
sigdelset
sigismember
(2)
sigprocmask
Núcleo
Nú l
pcb S.O.
S
Señales
Descripción
p
– Examina o modifica la máscara de señales activa para un proceso.
– Si una señal esta bloqueada por la máscara, no es procesada hasta el
momento t en que deja
d j de
d estar
t bloqueada
bl d por la
l máscara
á ( memoriza
(se i que
llegó).
S
Señales
sigprocmask
Descripción
– Parámetro how:
SIG_BLOCK: añade un conjunto de señales a las que se encuentran bloqueadas en la
máscara actual
S02 Sistemees operaatius II
Señales
sigprocmask: ejemplo
#include <unistd.h>
#include <stdlib.h>
<stdlib h>
#include <stdio.h>
#include <math.h>
#include <signal.h>
S02 Sistemees operaatius II
if (argc
( !=
! 2) {fprintf
{f i tf (stderr,
( td "Usage:
"U %s
% repeat_factor\n",
t f t \ " argv[0]);
[0]) exit(1);}
it(1) }
repeat_factor = 1000000*atoi(argv[1]);
sigemptyset(&intmask);
sigaddset(&intmask, SIGINT);
f ( ) {
for(;;)
sigprocmask(SIG_BLOCK, &intmask, NULL);
fprintf (stderr, "SIGINT signal blocked\n");
for(i=0; i<repeat_factor; i++) y=sin((double)i);
f i f (
fprintf (stderr,
d "Blocked
" l k d calculation
l l i is
i finished\n");
fi i h d\ ")
f (i 0 i<repeat_factor;
for(i=0; i f i++)
i ) y=sin((double)i);
i ((d bl )i)
fprintf (stderr, "Unblocked calculation is finished\n");
}
}
Señales
struct sigaction{
void
id (*sa_handler)
(* h dl ) ();
() /*SIG_DFL,
/* SIG_IGN o funcion
f i */
sigset_t sa_mask; /* las señales adicionales
serán bloqueadas durante la
ejecución del manejador */
int sa_flags; /* indicadores y opciones */
}
S
Señales
sigaction
Descripción
– Instala los manejadores de señal de un proceso.
– La señal se especifica en signo y los manejadores en act que es una estructura de tipo
struct
t t sigaction.
i ti El manejador
j d anterior l en oact.
t i se devuelve
d t
S02 Sistemees operaatius II
int main() {
int i; double y;
catch_ctrl_c();
h l ()
fprintf (stderr, "CTRL-C will be catched for 10 sec.\n");
for(i=0; i<10000000; i++) y=sin((double)i);
ignore_ctrl_c();
fprintf (stderr, "CTRL-C will be ignored for 10 sec\n");
for(i=0; i<10000000; i++) y=sin((double)i);
fprintf (stderr, "Program ends\n");
S
return 0;
}
Señales
sigaction: ejemplo (cont.)
void handler_ctrl_c(int signo)
{
write(STDERR_FILENO, handmsg, strlen(handmsg));
}
int catch_ctrl_c()
i h l ()
S02 Sistemees operaatius II
{
act.sa_handler = handler_ctrl_c;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
return sigaction(SIGINT, &act, NULL);
}
int ignore_ctrl_c()
{
if (sigaction(SIGINT, NULL, &act) == -1){
perror("Could not get old handler for SIGINT");
return -1;
} else if (act.sa_handler == handler_ctrl_c) {
act.sa_handler = SIG_IGN;
return sigaction(SIGINT, &act, NULL);
S
}
}
Señales
Descripción
– Establece la máscara de señal sigmask y suspende el proceso hasta que
reciba una señal no enmascarada en sigmask.
– Cuando retorna, se restablece la máscara de señales anterior.
– Si el proceso captura la señal, retorna después de ejecutar el manejador de la
señal.
V l de
Valor d retorno
t
– siempre –1.
S
Señales
sigsuspend: ejemplo
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
S02 Sistemees operaatius II
signum=atoi(argv[1]);
act.sa_handler = handler;
sigfillset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGALRM, &act, NULL);
sigaction(signum, &act, NULL);
sigfillset(&sigset);
sigdelset(&sigset, signum);
sigdelset(&sigset, SIGALRM);
Señales
Llamadas a sistema bloqueantes y señales.
– La llegada de una señal cuando un proceso se encuentra suspendido en una
llamada a sistema tiene el siguiente efecto.
Si la señal no tiene manejador Æ Se ejecuta la acción por defecto (normalmente exit;
matar el proceso)
S02 Sistemees operaatius II
...
manejador()
sigsuspend(...) sigsuspend(..)
wait(..)
( )
printf(“El proceso continua\n”); read(...)
... (otros)
S