2010-08-27 12 views
6

Si tiene un programa multiproceso (kernel de Linux 2.26) y un subproceso hace algo que causa una segfault, ¿los otros subprocesos aún se programarán para ejecutarse? ¿Cómo se terminan los otros hilos? ¿Puede alguien explicar el procedimiento de cierre del proceso con respecto a los programas multiproceso?¿Cómo se terminan los hilos durante un bloqueo de Linux?

Respuesta

6

Cuando se envía una señal fatal a un hilo, se llama a la función do_coredump() o do_group_exit(). do_group_exit() establece el código de salida del grupo de subprocesos y luego señala todos los otros subprocesos en el grupo de subprocesos para salir con zap_other_threads(), antes de salir del subproceso current. (do_coredump() llama al coredump_wait() que de manera similar llama al zap_threads()).

zap_other_threads() publica un SIGKILL por cada otro hilo en el grupo de hilos y lo despierta con signal_wake_up(). signal_wake_up() llama al kick_process(), que iniciará el subproceso en modo kernel para que pueda recibir la señal, usando un IPI si es necesario (por ejemplo, si se está ejecutando en otra CPU).


1. Inter-Procesador de interrupción

+0

¿Es esto en get_signal_to_deliver? Me parece que se llama a do_group_exit después de do_coredump (en el caso de coredump). ¿Pueden continuar otros subprocesos mientras se está tomando el coredump? No está claro para mí lo que hace zap_threads. – Andrew

+0

@abellia: 'do_coredump()' nunca regresa, por lo que se llama * o * 'do_group_exit()'. 'zap_threads()' es muy similar a 'zap_other_threads()' - también publica un 'SIGKILL' y despierta el objetivo. 'do_coredump()' elimina todos los hilos y espera a que salgan, luego realmente escribe el archivo central. – caf

5

¿Se ejecutará la programación del otro subproceso?

No. El SEGV es un problema de nivel de proceso. A menos que haya manejado el SEGV (que casi siempre es una mala idea), todo su proceso se cerrará y todos los hilos se mezclarán con él.

Sospecho que los otros hilos no se manejan muy bien. Si el controlador llama a exit() o _exit(), los manejadores de limpieza de subprocesos no serán llamados. Esto puede ser una buena cosa si su programa está gravemente dañado, va a ser difícil confiar en algo después de un fallo seg.

Una nota de la página signal hombre:

De acuerdo con POSIX, el comportamiento de un proceso es indefinido después de que hace caso omiso de una SIGFPE, SIGILL o SIGSEGV que no fue generada por la matanza (2) o las funciones elevar (3).

Después de un segfault, realmente no querrá hacer otra cosa que salir airoso de ese programa.

Cuestiones relacionadas