Señales en Linux

34
Señales en Linux 2013/ 04 Dani Gutiérrez Porset profesor asociado de Ing. de Comunicaciones Eman ta zabal zazu

Transcript of Señales en Linux

Page 1: Señales en Linux

Señales en Linux

2013/04

Dani Gutiérrez Porsetprofesor asociado

de Ing. de Comunicaciones

Eman ta zabal zazu

Page 2: Señales en Linux

2 2Señales en Linux

Fuentes y Referencias● man

● Wikipedia

● Fuentes del kernel

● http://www.advancedlinuxprogramming.com/

● http://www.linuxprogrammingblog.com/all-about-linux-signals

● http://www.linuxjournal.com/article/3985 (mayo 2000)

● http://www.linuxjournal.com/content/sigalrm-timers-and-stdin-analysis (marzo 2013)

Page 3: Señales en Linux

3 3Señales en Linux

Licencia, Agradecimientos y Herramientas

● Agradecimientos a todas las personas que han participado en los proyectos GNU y Linux. Gracias a la compartición libre de ese conocimiento es que esta presentación existe.

● Úsala, cópiala, difúndela, mejórala según los términos de la licencia: CC BY-SA 3.0 EShttp://creativecommons.org/licenses/by-sa/3.0/es/

● Esta presentación ha sido realizada íntegramente con KDE, LibreOffice y Chromium

Page 4: Señales en Linux

4 4Señales en Linux

Índice

● Definición de señal● Tabla y Clasificaciones de señales● Ocurrencia de una señal● Handlers de usuario● Señales en el contexto de un proceso● Procesos padres e hijos● Operaciones con señales● Interfaces C (y consejos de programación), consola y procfs

Page 5: Señales en Linux

5 5Señales en Linux

Definición de señal

● Interrupción del flujo o cambio de estadode un proceso o un thread...

● … de forma asíncrona (externa)o síncrona (ej. el propio proceso se pone en espera, o hay un timeout de una alarma)...

● … con un origen desde el kernel o desde otro proceso de usuario

● Se emplean como mecanismo de comunicación entre procesos.

Page 6: Señales en Linux

6 6Señales en Linux

Tabla de señales

● Inicialmente (POSIX.1-1990) 19 señales, hoy más de 60.

● Tienen un número y un nombre asociado:$ kill -l

● Ver tabla completa en:– man 7 signal

– /usr/include/asm-generic/signal.h

Page 7: Señales en Linux

7 7Señales en Linux

Clasificaciones de señales:Según su origen o causa

● Consola, ej. Ctrl-C, Ctrl-Z,...● Ventanas: SIGWINCH● Errores (originados por el propio proceso o el kernel), ej.

división por cero, acceso a memoria no existente● Cambios de estado, ej. finalización, detención, continuación● Ejecución de un proceso paso a paso● Alarmas● Comunicación entre procesos padres-hijos: SIGCHLD● Otras de uso generalista, ej. SIGUSR1

Page 8: Señales en Linux

8 8Señales en Linux

Clasificaciones de señales:Según el estándar que las define

● ANSI C (1983-...)http://en.wikipedia.org/wiki/C_Standard_Library

● BSD (1978-1995) https://en.wikipedia.org/wiki/Berkeley_Software_Distribution

● Unix System V (1983-1997) https://en.wikipedia.org/wiki/UNIX_System_V

● POSIX (1988-2008) http://en.wikipedia.org/wiki/POSIX ● Linux● (Single UNIX Specification)

http://en.wikipedia.org/wiki/Single_UNIX_Specification

Importante ver el apartado “Conforming to” en el man de cada función

Page 9: Señales en Linux

9 9Señales en Linux

Clasificaciones de señales:Comportamientos y handlers

● Según lo que haga el handler por defecto del sistema, en el caso de que éste esté activado:– Terminar el proceso. En este caso, con algunas se genera un fichero “core”

(si se tienen permisos de ficheros,...).– Detener el proceso– Continuar el proceso– No hacer nada (se ignora la señal)

● Señales “especiales”:– SIGKILL y SIGSTOP: no pueden ser ignoradas, gestionadas o bloqueadas.– SIGILL, SIGTRAP y SIGPWR: si se producen, su handler no se resetea al

valor por defecto

Page 10: Señales en Linux

10 10Señales en Linux

Clasificaciones de señales:estándares o real-time

● Señales real-time:– Tienen un uso orientado a aplicación.– Se pueden encolar múltiples (no sólo una) instancia

mientras una señal está bloqueada.– Permiten obtener más información al handler.– Se envían a un proceso en orden garantizado.– Las funciones C para usarlas son de la forma rt_...

Page 11: Señales en Linux

11 11Señales en Linux

Ocurrencia de una señal

¿Es“interceptable”?

No(SIGKILL,SIGSTOP)

● Ignorarla: SIG_IGN● Ejecutar la rutina (handler)

del sistema por defecto: SIG_DFL

● Ejecutar una función (handler)definida por el usuario

El sistema ejecutar la rutina (handler) por defecto

Se produceuna señal ¿Está

bloqueada?

¿Cuál esel comportamiento

definido?

No

Queda pendiente

Nota: lo indicado aquí es para Linux,no para sistemas Unix más antiguos

Page 12: Señales en Linux

12 12Señales en Linux

Handlers de usuario:Establecimiento

● Establecimiento con sigaction (2).● No es recomendable el uso de signal (2) para establecer

un handler de usuario por problemas de compatibilidad.● Formatos posibles:

void (*sa_handler)(int);

void (*sa_sigaction)(int, siginfo_t *, void *)

En ambos recibe como parámetro el identificador de la señal que ha originado su llamada.

Page 13: Señales en Linux

13 13Señales en Linux

Handlers de usuario:Ejecución (i)

● En algunos sistemas operativos, al entrar a la ejecución del handler se resetea a la función por defecto (SIG_DFL). Si esto ocurre, puede ser conveniente reestablecerlo:

– Al inicio, para que pueda ser llamado de nuevo durante su ejecución.– Al final, para que pueda ser llamado no durante la ejecución sino al

acabar la misma.● En Linux, al entrar a la ejecución del handler, según el flag

SA_RESETHAND usado en sigaction (2) el handler puede:

– Resetearse a SIG_DFL (con flag SA_RESETHAND)– Mantenerse (sin el flag).

Page 14: Señales en Linux

14 14Señales en Linux

Handlers de usuario:Ejecución (ii)

● Otros comportamientos “históricos”:

– System V original: señales “no seguras”; se pueden perder, etc.

– BSD, POSIX y Linux: señales seguras o fiables. Si se producen mientras están bloqueadas, pueden comprobarse.

System V BSD

¿Se resetea al handler por defecto? Sí No

¿Se bloquea? No Sí

¿Si el handler interrumpe una llamada del sistema con bloqueo, dicha llamada del sistema se reinicia automáticamente?

No Sí

Page 15: Señales en Linux

15 15Señales en Linux

Handlers de usuario:Ejecución (iii)

●Un handler podría ser interrumpido durante su ejecución y volver a ejecutarse o entrar a otro código.

●Cuidado con:–La programación del mismo handler para que sea reentrante.

–El uso de funciones no reentrantes del sistema operativo,ej. printf a reemplazar por write(ver lista de funciones seguras en man 7 signal).

Page 16: Señales en Linux

16 16Señales en Linux

Señales en el contexto de un proceso

●Cada proceso tiene información relativa a señalesEj. ver mediante procfs: $ grep Sig /proc/self/status

●Información:–Handlers de señales–Máscaras de bits asociadas a cada proceso, donde cada bit representa información sobre cada señal. Tipo struct sigset(ver /usr/include/asm-generic/signal.h)

Page 17: Señales en Linux

17 17Señales en Linux

Señales en el contexto de un proceso: Máscaras

● Máscaras respecto a las señales que pueden ocurrir:– Las se van a bloquear (“máscara del proceso”): aunque se

produzcan, de momento no se tratarán.– Las que se van a ignorar.– Las que se van a tratar con handler.– (Las anteriores no aplican a SIGKILL y SIGSTOP).

● Máscaras respecto a las que ya han ocurrido o señales que están pendientes: se han producido pero [aún] no se han tratado por estar bloqueadas, y se quedan en una cola de espera.

Page 18: Señales en Linux

18 18Señales en Linux

Procesos padres e hijos:Herencia

● En un fork(2) el proceso hijo:– Hereda la máscara de señales bloqueadas.– Tiene vacía la lista de señales pendientes.– Sí hereda los handlers.– No hereda timers.

● En un exec(3) el proceso lanzado:– Hereda la máscara de señales bloqueadas.– Mantiene la lista de señales pendientes.– No hereda los handlers.

Page 19: Señales en Linux

19 19Señales en Linux

Procesos padres e hijos:Procesos zombies (i)

● Todo proceso tiene:– Recursos, ej. memoria asignada.– Una entrada en la tabla de procesos, usada por el

padre para leer su código de salida al finalizar el hijo.

Page 20: Señales en Linux

20 20Señales en Linux

Procesos padres e hijos:Procesos zombies (ii)

● Cuando un proceso finaliza:– Se liberan sus recursos.– Si ha terminado con la función exit (3) se envía

automáticamente una señal al padre (SIGCHLD, SIGCLD).– Si el padre está vivo, a veces no se borra su entrada de la

tabla y queda en estado “zombie”.Peligro: alcanzar el máximo de PIDs y no poder crearse más procesos.

– Si el padre estaba muerto, el proceso init se encarga del huérfano y borra su entrada.

Page 21: Señales en Linux

21 21Señales en Linux

Procesos padres e hijos:Procesos zombies (iii)

● La entrada de la tabla de procesos sólo se borra en estos casos:– Automáticamente en sistemas “modernos” (ej. Linux kernel

>=2.6), si ocurre alguna de éstas condiciones:● Si el padre ignora SIGCHLD de forma explícita (estableciendo el

handler a SIG_IGN)● Si el padre tiene activado el flag SA_NOCLDWAIT.

– En todos los sistemas, cuando el padre llama a wait (2), sea dentro de un handler para la señal del hijo (SIGCHLD o la que sea), o fuera de un handler.

Page 22: Señales en Linux

22 22Señales en Linux

Procesos padres e hijos:Procesos zombies (v)

● Problema en el caso 2 si el padre no llama a wait (2). Posibles causas:– Porque la llama dentro de un handler de señal (ej.

SIGCHLD) pero esa señal no le ha llegado, ej. porque el hijo ha finalizado de forma anómala, no con exit (3).

– (Porque el padre está mal programado).

Page 23: Señales en Linux

23 23Señales en Linux

Procesos padres e hijos:Procesos zombies (vi)

● Soluciones:– Si el padre llama a wait (2) desde un handler, enviar al

padre la señal correspondiente, ej. mediante kill desde consola.

– En sistemas “modernos”: que el padre ignore SIGCHLD de forma explícita (estableciendo el handler a SIG_IGN) o activar el flag SA_NOCLDWAIT.

– (Matar al padre, en cuyo caso los hijos huérfanos son heredados por el proceso init el cual hace la limpieza).

Page 24: Señales en Linux

24 24Señales en Linux

Operaciones con señales

Lanzaruna señal

Esperara una señal

Definir eltratamiento

para una señal

Gestiónde bloqueos y

señalespendientes

Gestiónde máscarasde señales

Recordatorio C vs Consola. Según los apartados del manual man:...(1)... Ejecutables y comandos de shell…(2)... Funciones del kernel...(3)... Funciones de bibliotecas externas

Otras: timers,stack y saltos,información,

real-time

Page 25: Señales en Linux

25 25Señales en Linux

Ops. y funciones C:Lanzar una señal

● kill (2): enviar una señal a un proceso o a un grupo de procesos. Hay que tener permisos adecuados (ver man)

● raise (3): enviarse una señal a sí mismo

Otras:● I/O: pselect (2), fcntl(2)● Finalización de procesos: exit (3), abort (3)● killpg (2), tgkill (2), pthread_kill (3), sigqueue (3), killall5

(8), pthread_sigqueue (3)

Page 26: Señales en Linux

26 26Señales en Linux

Ops. y funciones C: Definir el tratamiento para una señal

● sigaction (2):– Establece la acción para una señal (SIG_DFL, SIG_IGN o un

handler).– Puede bloquear señales.– Se emplea una estructura C (ver man 2 sigaction):

● Dos handlers, el que se va a establecer y opcionalmente otro, para recibir parámetros extras.

● El handler antiguo (como valor de vuelta).● Una máscara de bloqueo de interrupciones.● Flags.

Page 27: Señales en Linux

27 27Señales en Linux

Ops. y funciones C:Esperar a una señal

● pause (2): espera a una señal

● sigsuspend (2): espera a una señal, pero permite especificar a cuáles mediante una máscara de bloqueo (bits a 0). Se reemplaza temporalmente la máscara de bloqueo del proceso.

● sigwait (3): semejante a la anterior, pero si se produce la señal y tiene un handler éste no es ejecutado, ni tampoco se reemplaza la máscara de bloqueo.

● Otras: sigtimedwait (2), sigwaitinfo (2), signalfd (2), signalfd4 (2), sigpause (3)

Page 28: Señales en Linux

28 28Señales en Linux

Ops. y funciones C: Gestión de bloqueos y señales pendientes

Ej. motivo para bloquearla: ej. se está dentro de otra función que no se quiere interrumpir● sigprocmask (2): examinar o modificar la máscara

de bloqueo de un proceso● sigpending (2): ver qué señales están pendientes

(estando bloqueadas se han producido)● Otras: pthread_sigmask (3)

Page 29: Señales en Linux

29 29Señales en Linux

Ops. y funciones C:Gestión de máscaras

Son operaciones sobre bits, más que de gestión de señales como tal● sigemptyset (3), sigfillset (3), sigaddset (3), sigdelset (3), sigismember (3)

● Extensiones de GNU Glibc: sigandset (3), sigorset (3), sigisemptyset (3)

Page 30: Señales en Linux

30 30Señales en Linux

Otras operaciones y funciones C

● Gestión de timers: alarm (2): al de un tiempo se lanza la señal SIGALARM al proceso que la ha establecido. Otras: getitimer (2), setitimer (2), ualarm (3)

● Relacionadas con el stack y con saltos: sigstack (3), sigaltstack (2), sigsetjmp(3), siglongjmp(3), sigreturn (2)

● De información: strsignal (3), psignal (3), psiginfo (3)● Gestión de señales real-time: con prefijo “rt_”. Más modernas

(desde el kernel 2.2) para gestionar señales de tiempo real. Ej: rt_sigaction (2)

● Otras: siginterrupt (3)

Page 31: Señales en Linux

31 31Señales en Linux

Funciones C obsoletas

● De ANSI C: signal (2): sólo útil si se elige ignorarla o ejecutar la rutina por defecto

● De BSD: bsd_signal (3), sigblock (3), siggetmask (3), sigmask (3), sigsetmask (3), sigvec (3)

● De System V: sysv_signal (3), sighold (3), sigignore (3), sigrelse (3), sigset (3), gsignal (3), ssignal (3)

● Otras: tkill (2), sgetmask (2), ssetmask (2)

Page 32: Señales en Linux

32 32Señales en Linux

Consejos para programación en C

● Incluir signal.h● Cuidado en los handlers de usuario:

– Con el uso de funciones del sistema no reentrantes– Con una programación no reentrante

● Ojo al comportamiento de cada función según el bit de la máscara sea 1 ó 0.

● Tratamiento de errores, ej. EINTR.● Ver apartado portabilidad en el man.

Page 33: Señales en Linux

33 33Señales en Linux

Interface de consola● Lanzar una señal a procesos:kill (1): según PIDkillall (1): según nombrepkill (1): según patron

● “Atrapar” una señal:trap - comando interno de bash para “atrapar” señales

● Ver las cuatro máscaras para un proceso:ps -o pending,blocked,ignored,caught

● Tracear señales:strace (1)

● Obsoletas: skill (1), snice (1)

$>

Page 34: Señales en Linux

34 34Señales en Linux

Interface procfs del kernel● Algunas entradas son de sólo lectura y otras permiten modificar límites.● Ficheros:

– /proc/[pid]/stat

– /proc/[pid]/status

– /proc/sys/kernel/rtsig-max

– /proc/sys/kernel/rtsig-nr

– /proc/sys/kernel/sysrq

● Se pueden configurar parámetros mediante:– /etc/sysctl.conf

– /etc/sysctl.d/*

● Más información en man 5 proc