Señales en Linux

1,185 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,185
On SlideShare
0
From Embeds
0
Number of Embeds
17
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Señales en Linux

  1. 1. Señales en Linux 2013/ 04 Dani Gutiérrez Porset profesor asociado de Ing. de Comunicaciones Eman ta zabal zazu
  2. 2. 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. 3. 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 ES http://creativecommons.org/licenses/by-sa/3.0/es/ ● Esta presentación ha sido realizada íntegramente con KDE, LibreOffice y Chromium
  4. 4. 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. 5. 5 5Señales en Linux Definición de señal ● Interrupción del flujo o cambio de estado de 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. 6. 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. 7. 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. 8. 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. 9. 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. 10. 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. 11. 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 produce una señal ¿Está bloqueada? ¿Cuál es el comportamiento definido? No Sí Queda pendiente Nota: lo indicado aquí es para Linux, no para sistemas Unix más antiguos
  12. 12. 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. 13. 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. 14. 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. 15. 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. 16. 16 16Señales en Linux Señales en el contexto de un proceso ● Cada proceso tiene información relativa a señales Ej. 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. 17. 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. 18. 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. 19. 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. 20. 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. 21. 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. 22. 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. 23. 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. 24. 24 24Señales en Linux Operaciones con señales Lanzar una señal Esperar a una señal Definir el tratamiento para una señal Gestión de bloqueos y señales pendientes Gestión de máscaras de 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. 25. 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. 26. 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. 27. 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. 28. 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. 29. 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. 30. 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. 31. 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. 32. 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. 33. 33 33Señales en Linux Interface de consola ● Lanzar una señal a procesos: kill (1): según PID killall (1): según nombre pkill (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. 34. 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

×