Обработчик SIGSEGV работает только 1 раз.Зачем? - PullRequest
0 голосов
/ 31 января 2019

Я хочу написать обработчик сигнала для перехвата 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 происходит из-за недопустимой ссылки на память.


- Ожидаемый результат:
В этой ситуации я ожидал бесконечный цикл.
mainheremy_signalhandlerheremy_signalhandlerhere ...


- реальный результат:

$ ./test_signal
Segmentation fault (core dumped)

Результатом стала только ошибка сегментации.(не бесконечный цикл.)
Во время отладки я обнаружил, что my_signalhandler срабатывает только 1 раз.
После этого обработчик сигнала не может перехватить сигнал.


- Вопрос:
Почему обработчик сигнала не может быть активирован несколько раз?

...