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