Обработка ошибок страницы с помощью libsigsegv. Поймать sigsegv несколько раз, затем потерпеть неудачу - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть устройство с отображенной памятью, которое периодически перестает отвечать, и доступ должен быть повторен, как при сбое страницы.Я использую обработчик sigsegv, чтобы поймать эти ошибки.Обработчик ловит сигнал sigsegv и подготавливает устройство к повторной попытке.

Я хотел бы, чтобы мой обработчик делал это несколько раз, скажем, от 10 до 100 раз, а затем, наконец, отказывался, вызывая системный sigsegv по умолчанию.действие, чтобы убить процесс (предположим, что устройство сломано).Как мне написать код?Я думаю, мне нужен пакет libsigsegv.Я ищу пример.Приведенный ниже код работает, за исключением того, что при перехвате sigsegv он зацикливается бесконечно

   /* Attach the handler */
   act.sa_handler = 0;
   act.sa_sigaction = sigsegv_handler;
   act.sa_flags = SA_SIGINFO;
   act.sa_restorer = 0;
   sigemptyset(&act.sa_mask);
   sigaction(SIGSEGV, &act, NULL);

   /* handler */
   void sigsegv_handler(int sig, siginfo_t *info, void *ctx)
   {
      /*fprintf(stderr, "%d: Got signal %d si_code %d, si_addr %p\n", 
        getpid(), sig, info->si_code, info->si_addr); */

      /* fix my bizarro device here */

      my_fault_storage_address = info->si_addr;
   }
...