Можно ли прекратить только один поток при получении SIGSEGV? - PullRequest
2 голосов
/ 03 сентября 2011

У меня есть приложение, которое запускает несколько потоков.Я использую обработчик сигнала, чтобы поймать сигналы.

Я не хочу, чтобы мое приложение закрывалось на SIGSEGV;Я хочу завершить только поток, который получил сигнал, и продолжить поток полного приложения в других потоках.Возможно ли это?

1 Ответ

5 голосов
/ 03 сентября 2011

Если происходит SIGSEGV, это означает, что ваша программа уже вызвала неопределенное поведение, то есть состояние всей программы неопределенное / неопределенное / недействительное. На практике возможно, что вы сможете восстановить и продолжить работу, но нет никакой гарантии, и это может быть опасно.

Как уже упоминал Асвейкау, вы можете longjmp из обработчика сигнала и попытаться очистить, но это может привести к еще худшему беспорядку, если сбой произойдет в середине malloc, free, printf или любая функция, изменяющая состояние глобальных данных или данных, которые используются совместно с другими потоками или к которым будет обращаться код очистки в месте назначения longjmp. Состояние может быть коррумпированным / непоследовательным, и / или блокировки могут быть оставлены и оставлены без возможности восстановления.

Если вы можете гарантировать, что этого не произойдет - например, если неправильно работающий поток никогда не вызывает какие-либо асинхронные небезопасные функции - тогда может быть безопасно longjmp выйти из обработчика сигнала, а затем вызвать pthread_exit.

Альтернативой может быть постоянное замораживание потока в обработчике сигналов путем добавления всех сигналов в sa_mask для SIGSEGV и последующей записи for (;;) pause(); в обработчике сигналов. Это на 100% «безопасно», но может оставить процесс в заблокированном состоянии, если какой-либо поток удерживал сбойный поток. Возможно, это "менее плохо", чем подвергать поврежденное состояние другим потокам и еще больше забивать ваши данные в ад ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...