señales en linux
Post on 24-Jun-2015
555 Views
Preview:
TRANSCRIPT
Señales en Linux
2013/04
Dani Gutiérrez Porsetprofesor asociado
de Ing. de Comunicaciones
Eman ta zabal zazu
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)
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
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
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.
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
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
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
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
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_...
11 11Señales en Linux
Ocurrencia de una señal
¿Es“interceptable”?
No(SIGKILL,SIGSTOP)
Sí
● 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
Sí
Queda pendiente
Nota: lo indicado aquí es para Linux,no para sistemas Unix más antiguos
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.
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).
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í
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).
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)
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.
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.
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.
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.
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.
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).
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).
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
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)
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.
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)
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)
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)
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)
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)
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.
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)
$>
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
top related