2010-08-27 3 views
6

Если у вас многопоточная программа (ядро Linux 2.26), а один поток выполняет что-то, что вызывает segfault, будут ли еще запланированы другие потоки? Как прекращаются другие потоки? Может ли кто-нибудь объяснить процедуру завершения процесса в отношении многопоточных программ?Как прекращаются потоки во время сбоя Linux?

ответ

6

Когда фатальный сигнал доставляется к нити, вызывается функция do_coredump() или do_group_exit(). do_group_exit() устанавливает код выхода группы потоков, а затем передает все остальные потоки в группе потоков для выхода с zap_other_threads(), прежде чем выйти из потока current. (do_coredump() звонит coredump_wait(), который аналогичным образом называет zap_threads()).

zap_other_threads() публикует SIGKILL для каждой другой нити в группе потоков и просыпается с signal_wake_up(). signal_wake_up() вызывает kick_process(), который загрузит поток в режим ядра, чтобы он мог получить сигнал, используя IPI , если необходимо (например, если он выполняется на другом ЦП).


1. Inter-Processor Interrupt

+0

Является ли это в get_signal_to_deliver? Мне кажется, что do_group_exit вызывается после do_coreump (в случае coredump). Могут ли другие нитки продолжать работать во время взятия coredump? Мне непонятно, что делает zap_threads. – Andrew

+0

@abellia: 'do_coredump()' никогда не возвращается, поэтому вызывается либо это *, либо * 'do_group_exit()'. 'zap_threads()' очень похож на 'zap_other_threads()' - он также отправляет 'SIGKILL' и просыпает цель. 'do_coredump()' убивает все потоки и ждет их выхода, а затем записывает основной файл. – caf

5

Будет ли еще запущен другой поток?

№ SEGV - проблема уровня процесса. Если вы не обработали SEGV (это почти всегда плохая идея), весь ваш процесс выйдет, и все потоки с ним.

Я подозреваю, что другие потоки не обрабатываются очень красиво. Если обработчик вызовов exit() или _exit() обработчики очистки потока не будут вызваны. Это может быть хорошо, если ваша программа сильно повреждена, вам будет трудно доверять многое из того, что произошло после сбоя seg.

Одно примечание со страницы signal человек:

В соответствии с POSIX, поведение процесса является неопределенным после того, как игнорирует SIGFPE, SIGILL, или сигнал SIGSEGV, который не был создан с помощью убийства (2) или функции повышения (3).

После segfault вы действительно не хотите ничего делать, кроме как вытащить из этой программы.

Смежные вопросы