Я думаю, что подход, который вы ищете, заключается в обработке сигнала SIGSEGV
через sigaction
.
void handler(int, siginfo_t *info, ucontext_t *uap)
{
/* Peek at parameters here... I'm not sure exactly what you want to do. */
}
/* Set up the signal handler... */
struct sigaction sa, old_sa;
memset(&sa, 0 sizeof(sa));
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;
if (sigaction(SIGSEGV, &sa, &old_sa))
{
/* TODO: handle error */
}
Обратите внимание, что перехват SIGSEGV
в вашем собственном процессеэто немного странноПроцесс, вероятно, находится в плохом состоянии, из которого невозможно восстановить.Действия, которые вы сможете выполнить в ответ на это, могут быть ограничены, и, скорее всего, удаляемый процесс - это хорошо.
Если вы хотите, чтобы он был немного более стабильным, естьsigaltstack
вызов, который позволяет вам указать буфер альтернативного стека, так что, если вы полностью закрепили свой стек, вы все равно можете обрабатывать SIGSEGV
.Чтобы использовать это, вам нужно установить SA_ONSTACK
в sa.sa_flags
выше.
Если вы хотите ответить на SEGV
из-за безопасности другого процесса (таким образом изолируя себя от плохо функционирующего кода segfaulting и делая егочтобы вы не потерпели крах при проверке), вы можете использовать ptrace
.Этот интерфейс сложен, имеет много непереносимых частей и в основном используется для написания отладчиков.Но вы можете делать с ним великие дела, такие как чтение и запись памяти и регистров процесса, а также изменять его выполнение.