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.

Conceptos básicos de señales 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. Por ejemplo, puede 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 generar código de máquina que incluye una división por cero operación.
  • Situaciones como el uso de combinaciones de teclas como
    instagram viewer
    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 hecho 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.

Números de señal

Las señales tienen varios valores numéricos, comenzando con uno. Por ejemplo, la 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 cambio.

Si examinas el /usr/include/signal.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.

Generación y envío de señales

La generación de señal se produce 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 se produce cuando la aplicación correspondiente vuelve a funcionar después del cambio de contexto.

El concepto de señal pendiente

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/status expediente.

# Para un proceso con PID: 2299
gato /proc/2299/estado

# Producción
...
SigQ: 2/31630
...

Máscaras de señal 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 manera, 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.

Tipos de señales de Linux

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 para 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:

Señal 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)
SEÑAL 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 16 Terminar aplicación
SIGUSR2 17 Terminar aplicación
SIGCHLD 18 Pasar por alto
SIGTSTP 20 Deténgase
SIGURG 21 Pasar por alto
SIGPOLL 22 Terminar aplicación
SEGUIMIENTO 23 Deténgase No
SIGCONT 25 Continuar si se detiene
SIGTTIN 26 Deténgase
SIGTTU 27 Deténgase
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.

¿Qué es un proceso en Linux?

Leer siguiente

CuotaPíoCuotaCorreo electrónico

Temas relacionados

  • linux
  • Núcleo de Linux
  • Administracion del sistema

Sobre el Autor

Fatih Küçükkarakurt (9 artículos publicados)

Ingeniero y desarrollador de software aficionado a las matemáticas y la tecnología. Siempre le ha gustado la informática, las matemáticas y la física. Ha desarrollado proyectos de motores de juegos, así como aprendizaje automático, redes neuronales artificiales y bibliotecas de álgebra lineal. Además continúa trabajando en aprendizaje automático y matrices lineales.

Más de Fatih Küçükkarakurt

Suscríbete a nuestro boletín

¡Únase a nuestro boletín para obtener consejos técnicos, reseñas, libros electrónicos gratuitos y ofertas exclusivas!

Haga clic aquí para suscribirse