You are on page 1of 12

SO2 Sistemas operativos II

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

– Accesos a memoria no permitidos: ‘Segmentation fault’, punteros “mareados”.


– ¿O como puede enterarse de eventos externos y tratarlos adecuadamente?
„ Se ha cortado la conexión con la terminal: la red ha fallado,
fallado la ventana ha sido
cerrada.
„ Se ha interrumpido la comunicación con un tubo
„ H muerto
Han t todos
t d los
l hijos
hij

„ 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

– Pueden filtrarse mediante una máscara

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

Establecimiento máscara pause(...)


sigprocmask(...) sigsuspend(…)

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

sigemptyset Iniciar una máscara para que no tenga señales seleccionadas

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

sigdelset Quitar una señal específica en un conjunto de señales

sigismember Consultar si una señal pertenece a un cto. de señales

sigprocmask
i k Examinar/modificar
/ f máscara de señales

sigaction Capturar/manejar señales

sigsuspend Esperar señales


S
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

3 SIGQUIT CTRL-\ de teclado (int. con core) core


6 SIGABRT Terminación anormal como con abort core
9 SIGKILL Terminación. No manejable ni ignorable exit
13 SIGPIPE Escritura en tubo sin lector exit
14 SIGALRM Alarma temporizada programada por alarm exit
15 SIGTERM Terminación por software exit

- SIGUSR1 Señal 1 definida por el usuario exit


S

Señales

„ Lista de señales / control de trabajos


Nº Señal Descripción DFL
DFL.
20 SIGCHLD Terminación/suspensión del proceso hijo ignore
19 SIGCONT CTRL-C de teclado ((interrupción)) continue
S02 Sistemees operaatius II

17 SIGSTOP Alto (no puede capturarse ni ignorarse) stop


18 SIGTSTP Alto de teclado CTRL-z stop

„ Control de trabajos en bash


$ cat > text $ cat > text
CTRL-Z CTRL-Z
[1]+ Stopped cat > text [1]+ Stopped cat > text
$ jobs $ jobs
[1]+ Stopped cat > text [1]+ Stopped cat > text
$ bg $ kill %1
[1]+ cat > text & [1]+ Terminated cat > text
S

$ fg %1
cat > text
Señales

„ kill: enviar una señal


#include
i l d <sys/types.h>
/ h
#include <signal.h>

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

– Número de señal no válido


– Permisos
S
Señales

„ alarm: generar una alarma (señal de reloj)


#i l d <unistd.h>
#include i d h

unsigned int alarm(unsigned int seconds)


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

„ Llamadas al sistema para definir una máscara de señales


#incl de <signal.h>
#include signal h

int sigemptyset(sigset_t *set)


int sigfillset (sigset_t
(sigset t *set)
S02 Sistemees operaatius II

int sigaddset (sigset_t *set, int signo)


int sigdelset (sigset_t *set, int signo)
i
int sigismember(const
i i b ( sigset_t
i *set,
* int
i signo)
i )

„ 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

máscara con sigprocmask.

sigemptyset
P1 (1) sigfillset
sigaddset
sigdelset
sigismember
(2)

sigprocmask

Núcleo
Nú l
pcb S.O.
S

Señales

„ sigprocmask: examinar/modificar máscara de señales


#include <signal.h>
<signal h>

int sigprocmask(int how, const sigset_t *set,


sigset t *oset)
sigset_t
S02 Sistemees operaatius II

„ 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

„ SIG_UNBLOCK: elimina un conjunto de señales de las que se encuentran bloqueadas


en la máscara actual
„ SIG_SETMASK: especifica un conjunto de señales que serán bloqueadas
– Parámetro set: conjunto de señales que serán utilizadas para la modificación.
Puede ser NULL.
NULL
– Parámetro oset: máscara previa a la modificación. Puede ser NULL.
„ Valor de retorno
– 0 si funciona y –1 si error (activa errno).
S

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

int main(int argc, char *argv[]) {


double y; sigset_t intmask; int i, repeat_factor;

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\ ")

sigprocmask(SIG_UNBLOCK, &intmask, NULL);


fprintf (stderr, "SIGINT signal unblocked\n");
S

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

„ sigaction: capturar/manejar señales


#i l d <signal.h>
#include i l h

int sigaction(int signo, const struct sigaction *act,


struct sigaction *oact)
S02 Sistemees operaatius II

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

– Si act=NULL, el manejador no cambia. Si no se necesita oact puede especificarse


NULL.
– Los manejadores son “permanentes” ( no es necesario volverlos a instalar después de la
ocurrencia de una señal)
– A los manejadores no se les puede pasar parámetros.
– SIG_DFL: instala la acción por defecto (exit, core, ...)
– SIG_IGN: se maneja la señal ignorándola (!= bloquearla)
„ Valor de retorno
– 0 si funciona y –1 si error
„ Errores
S

– Señal inválida o no manejable (SIGKILL, SIGSTOP)


Señales
„ sigaction: ejemplo
#include <sys/types.h>
#include <unistd.h>
<unistd h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#incl de
#include <math.h>
math h
S02 Sistemees operaatius II

char handmsg[] = "I found ctrl-c\n";


struct sigaction act;

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

„ sigsuspend: esperar señales


#include <signal.h>
<signal h>

int sigsuspend(const sigset_t *sigmask)


S02 Sistemees operaatius II

„ 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

char handmsg1[] = "Signal catched\n";


g
char handmsg2[] = "15 sec. timeout expired.\n";
p ;
struct sigaction act;

int signum, signal_received = 0;

void handler(int signo) {


if (signo!=SIGALRM) {
write(STDERR_FILENO, handmsg1, strlen(handmsg1));
} else {
signal_received=1;
write(STDERR_FILENO, handmsg2, strlen(handmsg2));
}
}
S
Señales
„ sigsuspend: ejemplo (cont.)
int main(int argc, char *argv[]) {
sigset_t
i sigset;
i
int i;

if (argc != 2) {fprintf (stderr, "Usage: %s signo\n", argv[0]); exit(1);}


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

fprintf (stderr, "Waiting for 15 sec occurrences of signal n: %s\n", argv[1]);


alarm(15);
g
while(signal_received == 0) sigsuspend(&sigset);
g g
S

fprintf (stderr, "Program terminated\n", argv[1]);


return 0;
}

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

„ Si la señal tiene manejador Æ Se ejecuta el manejador y la llamada a asistema


retorna con el valor -1 (el proceso se activa). Normalmente errno=EINT.

...
manejador()
sigsuspend(...) sigsuspend(..)
wait(..)
( )
printf(“El proceso continua\n”); read(...)
... (otros)
S

You might also like