2011-06-30 23 views
14

Tengo un programa en Linux que es multiproceso. Hay ciertas áreas de memoria en las que estoy interesado para ver si se han escrito dentro de un cierto período de tiempo. Para eso solo doy acceso de lectura a esas páginas de memoria e instalo un manejador de señal para SIGSEGV. Ahora mi pregunta es, ¿cada hilo llamará al manejador de señal por sí mismo? Say Thread 1 escribe en algún área de memoria prohibida, ¿será el que ejecutará el manejador de señal?es SIGSEGV entregado a cada hilo?

Respuesta

19

En primer lugar los

disposiciones de señal son de todo el proceso; todos los hilos en un proceso comparten la misma disposición para cada señal. Si un hilo usa sigaction() a establezca un controlador para, digamos, SIGINT, , luego ese manejador se puede invocar desde entregado cualquier hilo al que se entregue el SIGINT .

Pero leer en

Una señal puede dirigirse a cualquiera de los dos el proceso como un todo o a una hilo específico. Una señal es thread-dirigida si

se genera como resultado directo de la ejecución de una instrucción específica hardware dentro del contexto de la rosca (SIGBUS, SIGFPE, SIGILL, and SIGSEGV)

cito de TLPI.

+0

Eso significa que el gestor de señal SIGSEGV será ejecutado por el hilo que ha escrito en la memoria prohibida, ¿verdad? – MetallicPriest

+0

@MetallicPriest Sí, pero es el mismo controlador para todos los hilos. – cnicutar

+0

¿Depende también de qué hilo se llame mprotect? Creo que mprotect es para todo el proceso, ¿verdad? – MetallicPriest

5

No, por el título de la pregunta.

Al cuerpo de la pregunta: Para la señal particular que está solicitando, sí (de lo contrario: depende). El hilo que causa un segfault recibirá la señal.

Ver signal(7):

A signal may be generated (and thus pending) for a process as a whole (e.g., 
when sent using kill(2)) or for a specific thread (e.g., certain signals, such 
as SIGSEGV and SIGFPE, generated as a consequence of executing a specific 
machine-language instruction are thread directed [...]. 
+0

¿Por qué dices que no, cuando en la descripción está escrito que SIGSEGV está dirigido a hilos? – MetallicPriest

+3

Porque la pregunta es sobre "cada _ hilo". 'SIGSEGV' se entrega a _one_ thread (el que lo causó). Por lo tanto, no. (Pero, por supuesto, si no se maneja, puede (por lo general) matará todo el proceso, lo que obviamente afectaría a cualquier otro hilo, pero la señal no se entrega a cada uno). – Damon

+0

La pregunta en el título no coincide bastante con la pregunta en el cuerpo; están pidiendo la misma información subyacente, pero un "no" a uno es un "sí" a la otra. Por lo que es posible que desee ajustar su respuesta para aclarar a cuál le está respondiendo que "no". – ruakh

Cuestiones relacionadas