Sobre la entrega de señales estándar.

Por el contrario, si se envían múltiples instancias de una señal estándar mientras esa señal está actualmente bloqueada , entonces solo se pone en cola una instancia.

Creo que la descripción anterior no es tan clara y me causa ambigüedad:

¿Qué sucede si la señal específica no está bloqueada ? ¿Se pondrán en cola múltiples instancias de la misma señal?

¿Dónde está la señal en cola, una ubicación específica del proceso o una ubicación global?

¿Cómo se manejan las señales en cola, será posible que dos señales se procesen al mismo tiempo, o se garantiza que las señales se procesarán una por una?

Así que en realidad son 3 preguntas aquí ..

¿Qué sucede si la señal específica no está bloqueada? ¿Se pondrán en cola múltiples instancias de la misma señal?

Depende de si el indicador SA_SIGINFO se ha establecido para la señal utilizando la estructura sigaction y la función sigaction() , y si su sistema tiene una definición válida para _POSIX_REALTIME_SIGNALS (los núcleos modernos de Linux tienen). Si ambas instancias son ciertas, entonces cualquier señal de llegada que cumpla con esas dos condiciones se pondrá en cola en una cola por proceso hasta que se entreguen o acepten hasta los límites impuestos por el sistema operativo para la cantidad de elementos en una cola de señal determinada. Después de ese punto, cualquier otra señal que llegue para ese tipo de señal se eliminará.

Si cualquiera de esas situaciones no es verdadera, entonces solo se maneja la señal que llega actualmente, y cualquier otra señal del mismo tipo de señal que llegue mientras se está ejecutando el controlador de señal actual. Además, si está bloqueando la señal, y dos o más señales llegan al proceso y no se entregan, se fusionan en un solo evento de señal. Pero, nuevamente, esto es solo si las dos condiciones anteriores no se cumplen … de lo contrario, se colocarán en cola múltiples eventos de señal del mismo tipo.

Una nota más … las dos condiciones establecidas son para la especificación POSIX, pero Linux pondrá en cola cualquier señal en tiempo real, incluso si SA_SIGINFO no está configurado para esa señal. Eso significaría cualquier señal correspondiente al rango SIGRTMIN y SIGRTMAX.

¿Dónde está la señal en cola, una ubicación específica del proceso o una ubicación global?

Se almacena en una cola por proceso.

¿Cómo se manejan las señales en cola, será posible que dos señales se procesen al mismo tiempo, o se garantiza que las señales se procesarán una por una?

Esto depende de cómo configure el controlador de señales con la función sigaction struture y sigaction() . No se garantiza que ninguna otra señal se bloquee mientras se ejecuta el manejador de señales. Hay una máscara de señal que se puede establecer dentro de la sigaction determinar qué señales se bloquean mientras se ejecuta el manejador de señales. La señal en sí misma se bloquea hasta que el manejador de señal se completa, pero una señal diferente puede interrumpir su manejador de señal actual si no está bloqueada por la máscara de señal establecida para el manejador de señal establecido en su sigaction sigaction. Por lo tanto, cualquier cosa que haga en un controlador de señales debe ser async-safe, y no debe llamar a ninguna función que no sea async-safe en su controlador de señales como fprintf() , etc. Por lo tanto, se garantiza que la señal en sí misma se maneja en FIFO. orden (es decir, una señal no se interrumpirá por sí misma), pero otras señales pueden interrumpir su controlador de señal actual si no las ha bloqueado intencionalmente. Tenga en cuenta que configurar una máscara de señal dentro de su controlador de señales en un bash de bloquear otras señales para que no interrumpan su controlador es una muy mala idea, y no es una operación atómica, así que no haga eso. Si desea bloquear otras señales mientras se ejecuta el manejador de señales, proporcione una máscara de señal en la estructura sigaction que pasa a sigaction() .

Es una máscara de bits : ¿observa que todas las señales estándar tienen valores por debajo de 32 ?

Editar 0:

La “cola” para señales estándar es solo una máscara de bits por subproceso, por lo que una vez que se publica una señal y aún no se entrega, se establece el bit dado y se pierde la publicación de la misma señal hasta que se borra ese bit, es decir, se entrega la señal.

Edición 1:

Podemos obtener procesos secundarios de manera confiable porque ese mecanismo no se basa únicamente en señales. El kernel mantiene información detallada sobre la ascendencia del proceso, y el proceso hijo no desaparece una vez que salió, sino que se deja en la tabla de procesos para que el padre coseche (así es como criamos zombies, a la derecha :). Pendiente SIGCHLD significa “al menos uno de sus hijos cambió de estado, sumérjase en el núcleo para recoger los cadáveres”. La carrera aquí no está en la señal “cola”, sino en la tabla de procesos / árbol / lo que sea y el trabajo del núcleo es protegerla.

Si la señal se entrega mientras se maneja la misma señal, el controlador se volvería a invocar justo después del retorno de la invocación actual, por lo que habrá múltiples entregas de señal.

Por supuesto, si la señal se envía varias veces mientras aún se procesa la primera, solo se pondrá en cola una señal y solo se repetirá una invocación del controlador.

Las señales están marcadas como “pendientes” en el proceso del núcleo, por lo que hay una máscara de bits de señal separada para cada proceso y solo una señal de cada tipo (SIGBUS, SIGINT, SIGUSR1, etc.) puede estar pendiente, pero varias señales diferentes pueden estar pendientes simultáneamente.

Una señal se procesa a la vez, en cada hilo. Mientras se ejecuta el manejador de señales, todas las demás señales se bloquean automáticamente.

Por lo tanto, no es posible poner en cola múltiples de la misma señal en un solo hilo. Muchas señales diferentes, sin embargo, pueden aparecer en la cola.

Supongo que es posible que un manejador de señales desbloquee algunas señales antes de que salga, en este caso corre el riesgo de un desbordamiento de la stack de señales (la stack de llamadas utilizada para los manejadores de señales, no la cola de señales) si las señales se generaran más rápido que las señales. podría ser procesado