Вы не можете надеяться на восстановление после сегфоута. Вы можете обнаружить, что это произошло, и выгрузить соответствующее состояние, относящееся к конкретному приложению, если это возможно, но вы не можете продолжить процесс. Это потому что (среди прочих)
- Поток, который потерпел неудачу, не может быть продолжен, поэтому единственными опциями являются longjmp или прекращение потока. Ни один из них не является безопасным в большинстве случаев.
- В любом случае, вы можете оставить мьютекс / блокировку в заблокированном состоянии, что заставит другие потоки ждать вечно
- Даже если этого не произойдет, вы можете потерять ресурсы
- Даже если вы не сделаете ни одну из этих вещей, поток, в котором произошла ошибка, мог оставить внутреннее состояние приложения несогласованным, когда оно не удалось. Несогласованное внутреннее состояние может привести к ошибкам в данных или к дальнейшему плохому поведению, что вызовет больше проблем, чем простое завершение работы
Так что, в общем, нет смысла его ловить и делать что-либо, ЗА ИСКЛЮЧЕНИЕМ, завершающим процесс довольно резким образом. Нет смысла пытаться записывать (важные) данные обратно на диск или продолжать выполнять другую полезную работу. Есть некоторый смысл в выгрузке состояния в журналы - что делают многие приложения - и затем в выходе.
Возможно, полезной вещью может быть выполнение exec () вашего собственного процесса или создание сторожевого процесса, который перезапускает его в случае сбоя. (Примечание: exec не всегда имеет четко определенное поведение, если ваш процесс имеет> 1 поток)