Если у вас многопоточная программа (ядро Linux 2.26), а один поток выполняет что-то, что вызывает segfault, будут ли еще запланированы другие потоки? Как прекращаются другие потоки? Может ли кто-нибудь объяснить процедуру завершения процесса в отношении многопоточных программ?Как прекращаются потоки во время сбоя Linux?
ответ
Когда фатальный сигнал доставляется к нити, вызывается функция 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
Будет ли еще запущен другой поток?
№ SEGV - проблема уровня процесса. Если вы не обработали SEGV (это почти всегда плохая идея), весь ваш процесс выйдет, и все потоки с ним.
Я подозреваю, что другие потоки не обрабатываются очень красиво. Если обработчик вызовов exit() или _exit() обработчики очистки потока не будут вызваны. Это может быть хорошо, если ваша программа сильно повреждена, вам будет трудно доверять многое из того, что произошло после сбоя seg.
Одно примечание со страницы signal человек:
В соответствии с POSIX, поведение процесса является неопределенным после того, как игнорирует SIGFPE, SIGILL, или сигнал SIGSEGV, который не был создан с помощью убийства (2) или функции повышения (3).
После segfault вы действительно не хотите ничего делать, кроме как вытащить из этой программы.
- 1. Почему мои потоки прекращаются?
- 2. Почему потоки прекращаются, когда другие начинают выполнять?
- 3. Sgen.exe сбоя во время сборки
- 4. Обнаружение сбоя во время выполнения?
- 5. Как найти правильную линию сбоя в xcode во время сбоя
- 6. Отладка сбоя во время выхода приложения (WPF)
- 7. Двойная ошибка сбоя во время отладки
- 8. Блокировать atexit python во время сбоя?
- 9. SqlClient.SqlException возникает во время сбоя базы данных
- 10. программы C++ сбоя во время выполнения
- 11. Почему потоки C# простаивают во время выполнения?
- 12. Как ограничить время сбоя задачи в ядре linux
- 13. Как восстановить SVN после сбоя IDEA во время фиксации?
- 14. Как определить состояние приложения iOS во время сбоя
- 15. Как избежать сбоя вашего веб-приложения во время замены файла?
- 16. C потоки в linux?
- 17. Java-потоки спадают в linux
- 18. Как проверить, какие потоки создаются/удаляются во время выполнения программы?
- 19. Android - Как приостановить потоки во время другой активности?
- 20. Проблема производительности WCF: запросы прекращаются, обрабатываются
- 21. Как найти, когда потоки RTMP в реальном времени прекращаются в ActionScript?
- 22. Business Contuinity для веб-приложения Node.js во время сбоя сети
- 23. Как повторно запустить процесс Linux после сбоя?
- 24. Как проверить дамп сбоя в linux
- 25. На основе сбоя в программе во время работы
- 26. причины сбоя сегментации в Linux
- 27. AJAX: ошибка (устарела!) Работает во время сбоя. Зачем?
- 28. Создание многостраничного файла во время выполнения сбоя excel
- 29. Компиляция класса во время выполнения сбоя, когда CompilerParameters.GenerateInMemory == true
- 30. Android сбоя приложения во время работы на ОСАХ
Является ли это в get_signal_to_deliver? Мне кажется, что do_group_exit вызывается после do_coreump (в случае coredump). Могут ли другие нитки продолжать работать во время взятия coredump? Мне непонятно, что делает zap_threads. – Andrew
@abellia: 'do_coredump()' никогда не возвращается, поэтому вызывается либо это *, либо * 'do_group_exit()'. 'zap_threads()' очень похож на 'zap_other_threads()' - он также отправляет 'SIGKILL' и просыпает цель. 'do_coredump()' убивает все потоки и ждет их выхода, а затем записывает основной файл. – caf