Я хочу написать обработчик сигнала для перехвата SIGSEGV
в сборке.
Но я застрял, потому что обработчик сигнала работает только один раз.
Здесь я привел простой пример.
Вот весь код.
.global main
my_signalhandler:
jmp here
install_signalhandler:
.lcomm my_sigaction, 140
.set SIGSEGV, 11
.set SA_SIGINFO, 4
pushl $my_signalhandler
pushl $SIGSEGV
call signal
addl $8, %esp
ret
main:
call install_signalhandler # install signal handler
here:
jmp 0x11111111 # segmentation fault
В основном, функция install_signalhandler
устанавливает обработчик сигнала для SIGSEGV
.
После этого SIGSEGV
происходит из-за недопустимой ссылки на память.
- Ожидаемый результат:
В этой ситуации я ожидал бесконечный цикл.
main
→ here
→ my_signalhandler
→ here
→ my_signalhandler
→ here
...
- реальный результат:
$ ./test_signal
Segmentation fault (core dumped)
Результатом стала только ошибка сегментации.(не бесконечный цикл.)
Во время отладки я обнаружил, что my_signalhandler
срабатывает только 1 раз.
После этого обработчик сигнала не может перехватить сигнал.
- Вопрос:
Почему обработчик сигнала не может быть активирован несколько раз?