Mecanismo de señal de Linux El mecanismo de señal de Linux

detallado

  
es mucho más complicado de lo que se imagina, este artículo se esfuerza por utilizar el espacio más corto para realizar un análisis detallado y detallado del mecanismo.

1. Señales y fuentes de señales

Signal Essence

Una señal es una simulación del mecanismo de interrupción en el nivel de software. En principio, un proceso recibe una señal. Es lo mismo que recibir una solicitud de interrupción del procesador. La señal es asíncrona y el proceso no tiene que esperar a que llegue ninguna señal. De hecho, el proceso no sabe cuándo llega la señal.

Signal es el único mecanismo de comunicación asíncrono en el mecanismo de comunicación entre procesos. Puede considerarse como una notificación asíncrona, que informa al proceso de recibir señales de que algo ha sucedido. El mecanismo de señal es más poderoso después de ser extendido por POSIX en tiempo real. Además de la función de notificación básica, se puede transmitir información adicional.

Fuentes de señal

Los eventos de señal ocurren en dos fuentes: fuentes de hardware (como cuando presionamos un teclado u otro fallo de hardware): las fuentes de software, la función del sistema más utilizada para enviar señales es matar , las funciones de activación, alarma y setitimer y sigcoue, la fuente del software también incluye algunas operaciones ilegales.

Segundo, el tipo de señal

La señal se puede clasificar desde dos ángulos de clasificación diferentes: (1) Confiabilidad: señal confiable y señal no confiable rel? y relación de tiempo Arriba: Señales en tiempo real y señales no en tiempo real. Todas las señales admitidas por el sistema se enumeran en el Apéndice 1 de "Comunicación entre procesos en un entorno Linux (1): Canalizaciones y Canalizaciones con nombre".

1, señales confiables y señales no confiables

"señales no confiables" -

El mecanismo de señalización de Linux se hereda básicamente de los sistemas Unix. El mecanismo de señal en el sistema Unix inicial era relativamente simple y primitivo, y luego expuso algunos problemas en la práctica. Por lo tanto, las señales establecidas en el mecanismo inicial se llamaron señales poco confiables y el valor de la señal fue menor que SIGRTMIN (Red Hat 7.2). Las señales de SIGRTMIN = 32, SIGRTMAX = 63) son todas señales no confiables. Esta es la fuente de la "señal no confiable". Su problema principal es:

Después de procesar la señal, el proceso establece la respuesta a la señal a la acción predeterminada. En algunos casos, esto resultará en un manejo de errores de la señal, por lo tanto, si el usuario no desea tal operación, se llama nuevamente a la señal () al final del controlador de señales para reinstalar la señal.

La señal puede perderse, como se explica con más detalle más adelante.

Por lo tanto, la señal no confiable en el primer Unix se refiere principalmente al hecho de que el proceso puede responder incorrectamente a la señal y la señal se puede perder.

Linux admite señales no confiables, pero mejora el mecanismo de señal no confiable: después de llamar a la función de procesamiento de señales, no es necesario recuperar la función de instalación de la señal (la función de instalación de señales se implementa en un mecanismo confiable) . Por lo tanto, el problema de la señal no confiable en Linux se refiere principalmente a la posibilidad de que la señal se pierda.

" Señales confiables "

A medida que avanza el tiempo, la práctica ha demostrado que es necesario mejorar y extender el mecanismo original de la señal. Por lo tanto, varias versiones de Unix que aparecieron más tarde se han estudiado a este respecto, en un esfuerzo por lograr "señales confiables". Dado que la señal definida original tiene muchas aplicaciones, no es fácil realizar cambios. Finalmente, se han agregado algunas señales nuevas, que se definen como señales confiables al principio. Estas señales son compatibles con la puesta en cola y no se perderán. Al mismo tiempo, se envían e instalan nuevas versiones de la señal: la función de transmisión de señal sigqueue () y la función de instalación de señal sigaction (). POSIX.4 estandariza el mecanismo de señalización confiable. Sin embargo, POSIX solo estandariza las funciones del mecanismo de señal confiable y la interfaz externa del mecanismo de señal, y no especifica la implementación del mecanismo de señal.

Los valores de señal entre SIGRTMIN y SIGRTMAX son señales confiables, y las señales confiables superan el problema de la posible pérdida de señal. Mientras se admite la nueva versión de la función de instalación de señal sigation () y la función de envío de señal sigqueue (), Linux sigue admitiendo la función de instalación de señal de señal temprana () y la función de envío de señal kill ().

Nota: No tenga tal malentendido: la señal enviada por sigqueue () y sigaction es confiable. De hecho, una señal confiable es una nueva señal que se agrega más tarde (el valor de la señal se encuentra entre SIGRTMIN y SIGRTMAX); una señal no confiable es una señal con un valor de señal menor que SIGRTMIN. La confiabilidad y falta de fiabilidad de la señal solo están relacionadas con el valor de la señal y son independientes de las funciones de transmisión e instalación de la señal. Actualmente, la señal () en linux se implementa mediante la función sigation (). Por lo tanto, incluso si la señal se instala mediante la señal (), no es necesario llamar a la función de instalación de señales al final de la función de procesamiento de señales. Al mismo tiempo, la señal en tiempo real instalada por signal () admite la puesta en cola y no se perderá.

Para las dos funciones actuales de instalación de señales de Linux: signal () y sigaction (), no pueden convertir las señales anteriores de SIGRTMIN en señales confiables (no hay soporte para hacer colas, todavía es posible perder, aún Es una señal no confiable, y admite la puesta en cola de las señales después de SIGRTMIN. La mayor diferencia entre estas dos funciones es que la señal instalada por sigaction puede pasar información a la función de procesamiento de señal (que es verdadera para todas las señales), mientras que la señal instalada por señal no puede pasar información a la función de procesamiento de señal. Lo mismo es cierto para la función de señalización.

2, señales en tiempo real y señales no en tiempo real

Al principio del sistema Unix, solo se definieron 32 tipos de señales. Ret hat7.2 admite 64 tipos de señales, número 0-63 (SIGRTMIN = 31, SIGRTMAX = 63), puede aumentar aún más en el futuro, lo que debe ser compatible con el núcleo. Las primeras 32 señales ya tienen valores predefinidos, cada señal tiene un propósito y un significado definidos, y cada señal tiene su propia acción predeterminada. Si presiona CTRL ^ C en el teclado, se generará la señal SIGINT. La respuesta predeterminada a esta señal es la terminación del proceso. Las últimas 32 señales representan señales en tiempo real, equivalentes a las señales confiables establecidas anteriormente. Esto asegura que se reciban múltiples señales enviadas en tiempo real. Las señales en tiempo real son parte del estándar POSIX y pueden usarse en procesos de aplicación.

Las señales en tiempo no real no admiten la puesta en cola y son señales no confiables; las señales en tiempo real son compatibles con la cola y son señales confiables.

Tres, la respuesta del proceso a la señal

El proceso puede responder a una señal de tres maneras: (1) ignorar la señal, es decir, no realizar ningún procesamiento de la señal, de los cuales hay dos señales No se puede ignorar: SIGKILL y SIGSTOP; (2) capturar la señal. Defina la función de procesamiento de la señal; cuando ocurra la señal, ejecute la función de procesamiento correspondiente; (3) Realice la operación predeterminada, Linux especifica la operación predeterminada para cada señal, consulte [2] y otros materiales para obtener más información. Tenga en cuenta que la respuesta predeterminada del proceso a las señales en tiempo real es la terminación del proceso.

¿Cuál de Linux utiliza los tres métodos anteriores para responder a las señales, dependiendo de los parámetros pasados ​​a la función API correspondiente?

Cuarto, la transmisión de la señal

Las funciones principales de la señal son: kill (), raise (), sigqueue (), alarm (), setitimer () y abort ().

1, kill ()

#include < sys /types.h >

#include < signal.h >

int kill ( Pid_t pid, int signo)

El proceso de recepción del parámetro pid valor de señal

pid > 0 Proceso con ID de proceso pid

pid = 0 Proceso del mismo grupo de procesos

pid < 0 pid! = - 1 Todos los procesos con ID de grupo de procesos -pid

pid = -1 Todos los procesos con ID de proceso mayores que 1, excepto el proceso de envío en sí mismo <

Sinno es el valor de la señal. Cuando es 0 (es decir, la señal nula), en realidad no se envía ninguna señal, pero la verificación de errores se realiza de la manera habitual. Por lo tanto, se puede usar para verificar si existe el proceso objetivo y si el proceso actual tiene derecho a enviar una señal al objetivo.
(Un proceso con privilegios de root puede enviar una señal a cualquier proceso. Un proceso con privilegios no root solo puede enviar señales a procesos que pertenecen a la misma sesión o al mismo usuario).

Copyright © Conocimiento de Windows All Rights Reserved