wikipedia dijo:
Señal (informática)
Una señal (signal) es una forma limitada de comunicación entre procesos empleada en Unix y otros sistemas operativos compatibles con POSIX. En esencia es una notificación asíncrona enviada a un proceso para informarle de un evento. Cuando se le manda una señal a un proceso, el sistema operativo modifica su ejecución normal. Si se había establecido anteriormente un procedimiento (handler) para tratar esa señal se ejecuta éste, si no se estableció nada previamente se ejecuta la acción por defecto para esa señal.
http://es.wikipedia.org/wiki/Se%C3%B1al_(inform%C3%A1tica)
Para ver las señales que puede manejar nuestro sistema podemos hacer "kill -l" en una terminal y tendremos una salida como esta,

Una breve explicación de la mayoria de ellas,
wikipedia dijo:
La Single Unix Specification especifica las siguientes señales, definidas en <signal.h>:
SIGABRT - Proceso abortado.
SIGALRM - Señal de alarma, salta al expirar el timer. Reprogramable.
SIGBUS - Error en el bus "access to undefined portion of memory object"(SUS).
SIGCHLD - Proceso hijo terminado, detenido (*o que continúa). Tratamiento por defecto: ignorar. Reprogramable.
SIGCONT - Continúa si estaba parado.Tratamiento por defecto: continuar. Reprogramable.
SIGFPE - Excepción de coma flotante -- "erroneous arithmetic operation"(SUS).
SIGHUP - Hangup, al salir de la sessión se envía a los processos en Background. Tratamiento por defecto: exit. Reprogramable.
SIGILL - Instrucción ilegal.
SIGINT - Interrupción, se genera al pulsar "^c" durante la ejecución. Tratamiento por defecto:exit. Reprogramable.
SIGKILL - Destrucción inmediata del proceso.Tratamiento:exit. No reprogramable, no ignorable.
SIGPIPE - Se genera al escribir sobre la pipe sin lector. Tratamiento por defecto:exit. Reprogramable.
SIGQUIT - Terminar.
SIGSEGV - segmentation violation.Salta con dirección de memoria ilegal. Tratamiento por defecto:exit + volcado de memoria. Reprogramable.
SIGSTOP - Detiene el proceso. Se genera al pulsar "^z" durante la ejecución. No reprogramable, no ignorable.
SIGTERM - Terminación. Tratamiento por defecto:exit. Reprogramable.
SIGTSTP - Parada de terminal.
SIGTTIN - Proceso en segundo plano intentando leer ("in".
SIGTTOU - Proceso en segundo plano intentando escribir ("out".
SIGUSR1 - User defined 1. Signal definido por el usuario.Tratamiento por defecto: exit. Reprogramable.
SIGUSR2 - User defined 2. Signal definido por el usuario.Tratamiento por defecto: exit. Reprogramable.
*SIGPOLL - Pollable event.
*SIGPROF - El temporizador copiador expiró.
*SIGSYS - Mala llamada al sistema.
*SIGTRAP - Trace/breakpoint trap.
SIGURG - datos importantes disponibles en socket
*SIGVTALRM - "virtual timer expired"(SUS)
*SIGXCPU - excedido límite de tiempo de CPU
*SIGXFSZ - excedido límite de tamaño de fichero
Señales en bash.
Para atrapar señales en bash se utiliza el comando trap, la forma de usarlo es "trap comando_funcion señal1 señal2 etc", reemplazando comando_funcion por un comando o función que se llame cuando se atrapa alguna de esas señales, si el comando o función necesita parametros, encerrar, el comando o función junto con los parametros, entre comillas simples. Reemplazar señal1, señal2 y etc con la lista de señales que queremos atrapar con la función.
Por ejemplo:
trap mi_funcion SIGUSR1 SIGUSR2
trap 'echo "No me podes terminar"' SIGTERM
Si queremos ignorar una señal, trap '' nombre_señal, por ejemplo
trap '' SIGTERM,
ignorara la señal SIGTERM, si lo que queremos es restablecer el valor por defecto, trap nombre_señal, por ejemplo
trap SIGTERM.
Para enviar señales se puede usar "kill -señal pid", donde señal se debe reemplazar por la señal a enviar y pid por el pid del proseso al cual le queremos enviar la señal.
Este es un script de ejemplo que, tal vez, pueda ayudar a entender esto.
#!/bin/bash
# Función llamada cuando recibe la señal USR1.
function signal_SIGUSR1
{
echo "Se recibio la señal USR1."
}
# Función llamada cuando recibe la señal USR1.
function signal_SIGUSR2
{
echo "Se recibio la señal USR2."
echo "Esta señal se capturara una sola vez."
# Le asigna la acción por defecto de esa señal.
trap SIGUSR2
}
# Imprime el pid.
echo "Mi pid es: $$"
# Conecta las señales con las funciones.
trap signal_SIGUSR1 SIGUSR1
trap signal_SIGUSR2 SIGUSR2
# Ignora la señal SIGTERM
trap '' SIGTERM
# Espera las señales.
echo 'Estoy esperando señales...'
read
Para probarlo, en una terminal escribimos
bash ejemplo_señales.sh
y desde otra terminal podemos escribir
kill -SIGTERM pid, kill -SIGUSR1 pid o kill -SIGUSR2 pid
y observar el comportamiento del script.
Señales en python.
Para atrapar señales en python se utiliza el método signal del módulo signal, para eso importamos el módulo
import signal
El método signal necesita 2 parámetros, signalnum es la señal a capturar y handler es el método llamado cuando se captura la señal. Por ejemplo
signal.signal(signal.SIGUSR1, algun_metodo).
algun_metodo debe recibir 2 parámetros, el número de señal recibida y un "frame object" que no lo vamos a usar, en fin, el método tiene que tener esta forma
def algun_metodo(signum, frame):
Para ignorar una señal es
signal.signal(signal.la_señal, signal.SIG_IGN)
reemplazando la_señal por la señal a ignorar. Para restablecer una señal hacemos
signal.signal(signal.la_señal, signal.SIG_DFL)
reemplazando la_señal por la señal a restablecer.
Podemos usar
signal.pause()
para esperar que se atrape una señal.
Este es un ejemplo que, tal vez, pueda ayudar a entender esto.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import signal, os
# Función llamada cuando recibe la señal USR1.
def func_SIGUSR1(signum, frame):
print "Se recibio la señal USR1."
# Función llamada cuando recibe la señal USR2.
def func_SIGUSR2(signum, frame):
print "Se recibio la señal USR2."
print "Esta señal se capturara una sola vez."
# Le asigna la acción por defecto de esa señal.
signal.signal(signal.SIGUSR2, signal.SIG_DFL)
def main():
# Imprimir el pid.
print("Mi pid es: %i" % os.getpid())
# Conectar las señales con las funciones.
signal.signal(signal.SIGUSR1, func_SIGUSR1)
signal.signal(signal.SIGUSR2, func_SIGUSR2)
# Ignorar señal SIGTERM.
signal.signal(signal.SIGTERM, signal.SIG_IGN)
# Esperar las señales.
print("Estoy esperando señales...")
while True:
signal.pause()
if __name__ == '__main__':
main()
Para probarlo, en una terminal escribimos
python ejemplo_señales.py
y desde otra terminal podemos escribir
kill -SIGTERM pid, kill -SIGUSR1 pid o kill -SIGUSR2 pid
y observar su comportamiento.
Si queremos enviarle una señal a otro proceso con python podemos utilizar el método kill del módulo os.
import os
Para enviar la señal
os.kill(pid, senial)
donde senial es un número entero, correspondiente a la señal a enviar, pero podemos utilizar las constantes del módulo signal (signal.SIGTERM, signal.SIGUSR1, etc) y pid es el pid del proceso al cual enviarsela.
Este código se puede utilizar como el comando kill pero muy básico
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import signal, os, sys
def main():
# Obtiene el número de señal pasado como primer argumento.
senial = eval('signal.SIG' + sys.argv[1])
# El pid es el segundo argumento.
pid = int(sys.argv[2])
# Envía la señal.
os.kill(pid, senial)
if __name__ == '__main__':
main()
El modo de uso es por ejemplo
python envia_señales.py TERM 2548.
Eso es todo, espero haber sido claro, sino cualquier duda, MP.

wikipedia dijo:
