linux Signal Explicación de la generación y el manejo

El mecanismo de señalización en el kernel de Linux permite que las aplicaciones en ejecución notifiquen al sistema de manera asíncrona cuando ocurre un nuevo evento. Debido a su naturaleza, este mecanismo de señalización se conoce generalmente como interrupciones de software. Al igual que las interrupciones de hardware, las señales interrumpen el flujo normal de una aplicación y es impredecible cuándo una aplicación recibirá una señal.

Profundicemos en el mecanismo de señalización en Linux y comprendamos lo que sucede detrás de escena.

Básico Signal Conceptos en Linux

En Linux, los procesos generan señales en tres situaciones básicas:

  • Cuando se presenta una situación excepcional en el lado del hardware. Para examplepuede pensar en eventos como que la aplicación intente acceder a una región fuera del espacio de direcciones permitido (falla de segmentación) o genere un código de máquina que incluya una operación de división por cero.
  • Situaciones como el uso de combinaciones de teclas como Control + C o Control + Z en la consola por parte del usuario, cambiando el tamaño de la pantalla de la consola o enviando una señal de eliminación.
  • El temporizador configurado en la aplicación expira, el límite de CPU asignado a la aplicación es alto, los datos llegan a un descriptor de archivo abierto, etc.

El concepto de señales ha existido desde las primeras versiones de Unix. Previamente, había varias diferencias entre las versiones de Unix con respecto al procesamiento de señales. Más tarde, con la estandarización POSIX realizada para la gestión de señales, Linux y otros derivados de Unix comenzaron a seguir estos estándares. Por esta razón, los conceptos de señales Unix y señales POSIX, que puede encontrar en algunos documentos, señalan las diferencias.

Signal Números

Las señales tienen varios valores numéricos, comenzando con uno. Para examplela señal 1 es una HUP señal en casi todos los sistemas, o la señal 9 es una MATAR señal.

Sin embargo, se desaconseja encarecidamente el uso de estos números cuando utilice señales en sus aplicaciones. Para señales POSIX, señal.h El archivo debe estar en la aplicación y el desarrollador debe usar las definiciones constantes de números relacionados, como SUSCRÍBETE , sigilo etc. en su lugar.

Si examinas el /usr/incluir/señal.h archivo en su sistema, puede ver las operaciones adicionales y otros archivos incluidos mirando las definiciones de valores como __USE_POSIX , __USE_XOPEN , __USE_POSIX199309 , etc. en el archivo. Puede encontrar los números de señal disponibles en los sistemas Linux en el /usr/include/asm-generic/signal.h archivo, que no necesita incluir directamente en el código de su aplicación.

Signal Generación y Envío

Signal la generación ocurre debido a un evento. Sin embargo, el envío (entrega) de la señal a la aplicación relevante no ocurre simultáneamente con la generación de la señal.

Para que la señal se envíe a la aplicación, la aplicación debe estar ejecutándose actualmente y tener recursos de CPU. Por lo tanto, el envío de una señal a una aplicación específica ocurre cuando la aplicación correspondiente vuelve a funcionar después del cambio de contexto.

el pendiente Signal Concepto

Durante el tiempo que transcurre desde la generación hasta la transmisión de la señal, las señales están en estado de espera. Puede acceder a la cantidad de señales pendientes y la cantidad de señales pendientes permitidas para un proceso desde la /proc/PID/estado expediente.

                      
                        
                          # For a process with PID: 2299
                        
                        
cat /proc/2299/status

# Output
...
SigQ: 2/31630
...

Signal Máscaras y Bloqueo

La hora exacta en que llegarán las señales a menudo es impredecible para la aplicación. Por lo tanto, pueden ocurrir algunas interrupciones críticas durante cualquier operación. Esto puede causar problemas importantes para una aplicación a gran escala.

Para evitar algunas situaciones indeseables como esta, es necesario utilizar máscaras de señal. Así es posible bloquear algunas señales antes de una operación crítica. En esta etapa, es importante completar la parte crítica y eliminar los bloques definidos. Este proceso es algo a lo que el desarrollador de aplicaciones debe prestar atención.

Cuando la aplicación bloquea una señal, otras señales del mismo tipo generadas estarán en estado de espera hasta que se desbloqueen. En la aplicación, también se proporciona el envío de señales pendientes tan pronto como se elimina el bloqueo.

De esta forma, los mismos tipos de señales puestas en espera en el momento del bloqueo se envían a la aplicación solo una vez después de que se elimine el bloqueo en uso normal. La situación es diferente para las señales en tiempo real.

linux Signal Tipos

Las acciones predeterminadas pueden variar según los tipos de señal. Si la aplicación que recibe la señal correspondiente no tiene una función de manejo de señales, se lleva a cabo la acción predeterminada. A veces, esto significa terminar la aplicación y, a veces, ignorar la señal.

Algunas señales no se pueden capturar en la capa de aplicación, estas señales siempre realizan la acción predeterminada (como la señal KILL).

Además de algunas acciones que provocan la finalización de una aplicación, también se genera un archivo de volcado del núcleo. Los archivos de volcado del núcleo, creados al escribir la tabla de memoria virtual del proceso relacionado en el disco, ayudan al usuario a examinar la información de estado antes de que finalice el proceso con herramientas de depuración en las siguientes etapas.

Los siguientes valores se basan en un arquitectura MIPS ejemplar :

Signal Número Acción por defecto ¿Se puede atrapar?
SUSCRÍBETE 1 Terminar aplicación
SEGUIR 2 Terminar aplicación
SIGQUITAR 3 Terminar la aplicación (volcado del núcleo)
SELLO 4 Terminar la aplicación (volcado del núcleo)
SIGTRAP 5 Terminar la aplicación (volcado del núcleo)
SIGABRT 6 Terminar la aplicación (volcado del núcleo)
SIGFPE 8 Terminar la aplicación (volcado del núcleo)
sigilo 9 Terminar aplicación No
SIGBUS 10 Terminar la aplicación (volcado del núcleo)
SIGSEGV 11 Terminar la aplicación (volcado del núcleo)
SIGSYS 12 Terminar la aplicación (volcado del núcleo)
TUBO DE SEÑAL 13 Terminar aplicación
SIGALRM 14 Terminar aplicación
SIGTERM 15 Terminar aplicación
SIGUSR1 dieciséis Terminar aplicación
SIGUSR2 17 Terminar aplicación
SIGCHLD 18 Ignorar
SIGTSTP 20 Detenerse
SIGURG 21 Ignorar
SIGPOLL 22 Terminar aplicación
SEGUIMIENTO 23 Detenerse No
SIGCONT 25 Continuar si se detiene
SIGTTIN 26 Detenerse
SIGTTU 27 Detenerse
SIGVTALRM 28 Terminar aplicación
SIGPROF 29 Terminar aplicación
SIGXCPU 30 Terminar la aplicación (volcado del núcleo)
SIGXFSZ 31 Terminar la aplicación (volcado del núcleo)

Ciclo de vida de las señales en Linux

Las señales pasan por tres etapas. Se producen principalmente en la fase de producción, por el núcleo o cualquier proceso, y se representan con un número. Trabajan de forma ligera y rápida, ya que no tienen ninguna carga extra sobre ellos. Pero si observa el lado POSIX, verá que las señales en tiempo real pueden transmitir datos adicionales.

La fase de entrega de las señales viene después de la fase de producción. Normalmente, las señales llegan a la aplicación desde el kernel lo más rápido posible. Sin embargo, a veces las aplicaciones pueden bloquear señales mientras realizan operaciones críticas. En tales casos, la señal permanece pendiente hasta que se realiza la transacción.

Al igual que las señales, los procesos también son una parte integral del ecosistema Linux. Comprender qué son los procesos y cómo funcionan es crucial si planea convertirse en administrador del sistema Linux.

Related Posts