LINUX

Eliminar señales en Linux (cuántas diferentes)

Las señales en Linux son un concepto muy importante de entender. Esto se debe a que las señales se utilizan en algunas de las actividades comunes que realiza a través de la línea de comandos de Linux. Por ejemplo, cada vez que presiona Ctrl+c para terminar un comando en ejecución desde la línea de comandos, usa señales.

Siempre que uses ‘kill -9 [pid]’para matar un proceso, usa señales. Entonces, es muy útil conocer al menos los conceptos básicos de las señales y eso es exactamente lo que discutiremos en este tutorial.

¿Qué es una señal?

Una señal no es más que una forma de comunicar un mensaje de un proceso a otro. Estos mensajes se conocen popularmente como notificaciones y el proceso de recepción es libre de procesar, ignorar o dejar que el sistema operativo tome la acción predeterminada (más sobre estas opciones más adelante). Una notificación enviada por el proceso del remitente al proceso de recepción puede ser de varios tipos. Por ejemplo, una notificación puede ser para matar el proceso de recepción o hacerle saber que ha accedido a un área de memoria no válida o puede ser una notificación de la disponibilidad de un recurso (que estaba ocupado antes), etc. Las señales no son más que otra forma de IPC (comunicación entre procesos).

¿Por qué son importantes las señales?

Las señales son importantes, de hecho, muy importantes porque impulsan algunas de las actividades de programación y administración de sistemas más populares. Por ejemplo, tomemos el ejemplo de un depurador. La mayoría de los programadores utilizan un depurador para depurar el código de su programa mientras se ejecuta. Si alguna vez hubiera usado un depurador, sabría que los puntos de interrupción se usan para detener la ejecución de un programa en líneas de código específicas.

¿Alguna vez pensó qué hace que un programa se dé cuenta de que se ha alcanzado un punto de interrupción y debe detener la ejecución? Sí, es una señal (SIGSTOP) que se envía al programa en este caso. Y cuando el usuario termina con la depuración, se envía una señal (SIGCONT) al programa, después de lo cual el programa continúa la ejecución.

Entonces, este fue un ejemplo. Pero hay muchas otras actividades que dependen completamente de las señales.

¿Cómo maneja un programa las señales?

Un programa puede manejar señales de las siguientes tres formas:

  1. Un programa puede proporcionar su propio manejador de señales para manejar una señal en particular. – Esto es especialmente importante en aquellos casos en los que un programa tiene que realizar algunas tareas (por ejemplo, actividades de limpieza de memoria) en respuesta a la señal recibida. Un manejador de señales no es más que una función definida en el código del programa que se ejecuta automáticamente (en realidad, el kernel del sistema operativo la activa) cuando el programa recibe una señal.
  2. Un programa no puede hacer nada al recibir una señal – Cada señal tiene una acción predeterminada asociada. En un escenario donde a un programa simplemente no le importa una señal, la acción predeterminada correspondiente a esa señal en particular la toma el kernel del sistema operativo.
  3. Un programa puede optar por ignorar una señal – En esta situación, la señal (o conjunto de señales) se bloquean y, por lo tanto, no se envían al programa. Un programa puede optar por ignorar las señales que, según piensa el programador, son irrelevantes para él.

Diferentes tipos de señales

Para obtener una lista de señales compatibles con su sistema Linux, simplemente ejecute el siguiente comando:

kill -l

La opción -l del comando kill se usa para listar los nombres de las señales. Aquí está el resultado de este comando en mi sistema:

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

Entonces puede ver que la salida consta de todas las señales admitidas por mi sistema. Para tener una idea sobre algunas de las señales populares, lea Señales C ++ tutorial.

Si es un administrador del sistema o un usuario de la línea de comandos de energía, definitivamente habría usado el siguiente comando para matar un proceso:

kill -9 <pid>

Donde pid es el identificador del proceso que desea matar.

¿Alguna vez pensaste qué significa exactamente -9? Bueno, significa una señal con valor numérico 9. Sí, las señales (como puede ver en la salida de ‘kill -l’ arriba) tienen valores numéricos asociados con ellas. Para saber qué señal tiene un valor numérico de 9, use el siguiente comando:

$ kill -l 9
KILL

Entonces puede ver que el valor numérico 9 corresponde a SIGKILL. De manera similar, si necesita traducir el nombre de una señal a su valor numérico, puede usar el mismo comando.

Por ejemplo :

$ kill -l KILL
9

Entonces puede ver que de esta manera, se puede obtener el valor numérico correspondiente a un nombre de señal.

Señales SIGSTOP Y SIGKILL

Las señales SIGSTOP y SIGKILL merecen una mención especial por el hecho de que estas señales no pueden ser manejadas por programas.

SIGSTOP – Esta señal es enviada por un proceso para detener un programa para que pueda ser depurado. Ahora, suponga que si los programas tuvieran la capacidad de manejar esta señal y un programa accidentalmente elige ignorar esta señal, entonces ese programa no se podrá depurar nunca.

SIGKILL – Esta señal es enviada por un proceso para terminar el proceso de recepción inmediatamente. Esto significa que la terminación es anormal y no elegante. Esta señal se usa en los casos en los que un proceso se bloquea o debe terminarse inmediatamente; por ejemplo, el kernel del sistema operativo usa esta señal a veces cuando el sistema está apagado.

Características de las señales

Estas son algunas de las características importantes de las señales de Linux:

  • Si un proceso tiene varios subprocesos, una señal interrumpe solo un subproceso y no el proceso completo. Esto se aplica a la versión 2.6 del kernel de Linux y superior.
  • Un manejador de señales también puede ser interrumpido por la recepción de otra señal.
  • Además del conjunto estándar de señales. También puede haber señales definidas por el usuario.
  • En términos de código, el manejo de señales se puede realizar usando funciones como signal () y sigaction ().

Envíenos sus pensamientos y sugerencias sobre este artículo. Gracias por leer.

Leer también:

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar