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
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
¿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.
- 1. Los hilos java se eliminan cuando terminan
- 2. ¿Cómo termina JVM los hilos daemon? o Cómo escribir hilos daemon que terminan correctamente
- 3. hilos GEvent no terminan a pesar de que todos los elementos de la cola se agotan
- 4. ¿Cómo detener los hilos del kernel de Linux en rmmod?
- 5. Multicore + Hyperthreading: ¿cómo se distribuyen los hilos?
- 6. ¿Cómo enumerar los hilos abiertos por cada aplicación en Linux?
- 7. scala actors vs hilos y bloqueo IO
- 8. ¿cómo se comunican los hilos entre sí?
- 9. netbeans Cunit pruebas de los casos no se terminan nunca
- 10. ¿Cómo encontrar todos los archivos que terminan en .rb con Linux?
- 11. Cómo implementar el bloqueo de lectura utilizando hilos POSIX
- 12. bloqueo en una variable en múltiples hilos
- 13. Cómo activar la pantalla durante el bloqueo parcial de activación
- 14. entendimiento sincronización de hilos de bloqueo y no Thread.MemoryBarrier
- 15. Cómo liberar inmediatamente los hilos que esperan en un BlockingQueue
- 16. ¿Qué determina cuál de los dos hilos que compiten adquiere un bloqueo?
- 17. Distinción entre procesos e hilos en Linux
- 18. ¿Cómo newCachedThreadPool reutiliza los hilos?
- 19. ¿Cómo están programados los hilos java?
- 20. ¿Cómo aborta AppDomain.Unload() los hilos?
- 21. ¿Cómo funciona realmente el bloqueo de I/O de Linux?
- 22. ¿Los hilos creados en Java se comportan de manera diferente en Windows y Linux?
- 23. ¿Cómo se leen los registros de bloqueo de iOS 4?
- 24. Enhebrado de Python. ¿Cómo bloqueo un hilo?
- 25. ¿Por qué deberías bloquear los hilos?
- 26. ¿Terminan los métodos con _! tiene un significado especial en Scala?
- 27. Buscar hilos que se ejecutan para un proceso en particular en Linux
- 28. Señalización de todos los hilos en un proceso
- 29. ¿Cómo se prueba un método que genera hilos?
- 30. ¿Cómo se clasifican los hilos CUDA en urdimbres?
¿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
@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