¿Qué le sucede a un proceso Linux multiproceso si recibe una señal?

20

Si un proceso de Unix (Posix) recibe una señal, se ejecutará un controlador de señal.

¿Qué le pasará en un proceso multiproceso? ¿Qué hilo recibe la señal?

En mi opinión, la API de señal debería extenderse para manejar eso (es decir, el subproceso del controlador de señal debería poder determinarse), pero buscando información en la red solo encontré llamas de un año en la lista de correo del kernel de Linux y en diferentes foros Como entendí, el concepto de Linus difería del estándar Posix, y primero se construyó una capa de compatibilidad, pero ahora Linux sigue el modelo posix.

¿Cuál es el estado actual?

peterh - Restablece a Monica
fuente
3
Duplicado de stackoverflow.com/questions/11679568/… "pthreads (7) describe que POSIX.1 requiere que todos los hilos en un proceso compartan atributos, incluidas las disposiciones de señal"
steve
@steve Gracias, pero 1) está en otro sitio de SE 2) esta especificación no especifica claramente lo que sucederá exactamente. Lo que significa, los manejadores de señal serán llamados en todos los hilos, pero me parece un poco surrealista. 3) Esa respuesta no especifica cuál era el modelo de Linus y por qué / cómo se usa actualmente.
peterh - Restablece a Mónica el

Respuestas:

9

La entrada en POSIX sobre " Generación y entrega de señales " en "Justificación: Información general de las interfaces del sistema" dice

Las señales generadas para un proceso se entregan a un solo hilo. Por lo tanto, si más de un hilo es elegible para recibir una señal, se debe elegir uno. La elección de los subprocesos se deja totalmente en manos de la implementación, tanto para permitir la gama más amplia posible de implementaciones conformes y para dar a las implementaciones la libertad de entregar la señal al subproceso "más fácil posible" si hubiera diferencias en la facilidad de entrega entre diferentes subprocesos.

Del signal(7)manual en un sistema Linux:

Se puede generar una señal (y, por lo tanto, pendiente) para un proceso en su conjunto (por ejemplo, cuando se envía usando kill(2)) o para un subproceso específico (por ejemplo, ciertas señales, como SIGSEGV y SIGFPE, generadas como consecuencia de la ejecución de una máquina específica) la instrucción de idioma está dirigida por hilos, al igual que las señales dirigidas a un hilo específico que usa pthread_kill(3)). Se puede entregar una señal dirigida al proceso a cualquiera de los hilos que actualmente no tienen la señal bloqueada. Si más de uno de los hilos tiene la señal desbloqueada, entonces el núcleo elige un hilo arbitrario al que entregar la señal.

Y en pthreads(7):

Los subprocesos tienen configuraciones distintas de pila de señal alternativa. Sin embargo, la configuración de la pila de señal alternativa de un nuevo subproceso se copia del subproceso que la creó, de modo que los subprocesos inicialmente comparten una pila de señal alternativa (fijada en el núcleo 2.6.16).

Del pthreads(3)manual en un sistema OpenBSD (como ejemplo de un enfoque alternativo):

Los manejadores de señales normalmente se ejecutan en la pila del hilo que se está ejecutando actualmente.

(Actualmente no estoy al tanto de cómo se maneja esto cuando varios subprocesos se ejecutan simultáneamente en una máquina multiprocesador)

La implementación anterior de LinuxThread de hilos POSIX solo permitía que hilos individuales distintos fueran apuntados por señales. Desde pthreads(7)un sistema Linux:

LinuxThreads no admite la noción de señales dirigidas por procesos: las señales pueden enviarse solo a hilos específicos.

Kusalananda
fuente