Когда сигнал автоматически перебрасывается?

Следующий комментарий в breakpad предполагает, что сброс обработчика сигнала приводит к повторному запуску сигнала. Однако мне не удалось найти в Интернете никакой документации, описывающей такое поведение.

Кроме того, комментарий здесь говорит, что как только обработчик сигнала вернется, сигнал будет сгенерирован повторно. Является ли это также результатом восстановления или сброса обработчика сигнала по умолчанию?


person black    schedule 14.11.2019    source источник


Ответы (1)


предполагает, что сброс обработчика сигнала приводит к повторному запуску сигнала

говорит, что как только обработчик сигнала вернется, сигнал будет сгенерирован повторно

Ни то, ни другое не верно. Однако я не верю, что это то, что подразумевают комментарии. Скорее всего, в некоторых случаях он оставляет сигнал необработанным. Таким образом, первоначальная проблема, вызвавшая сигнал, снова вызывает тот же сигнал. Рассмотрим этот пример:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void handler(int sig)
{
    write(1, "Received FPE\n", sizeof "Received FPE\n" - 1);
}

int  main(void)
{
    signal(SIGFPE, handler);
    printf("%f", 1/0);
}

(Это должно вызвать бесконечный цикл).

SIGFPE на самом деле здесь не обрабатывается. Таким образом, как только управление возвращается из обработчика сигнала, SIGPFE повторно запускается. Я считаю, что это сценарий, который упоминается в этих комментариях.

Точно так же, когда сигналы заблокированы, они будут поставлены в очередь и отправлены в процесс после разблокировки. Они маскируют его при установке их обработчик сигнала. Это, вероятно, то, что относится ко второму комментарию. Маскирование также можно выполнить с помощью sigprocmask или pthread_sigmask.

person P.P    schedule 14.11.2019
comment
Таким образом, без явного выхода или восстановления обработчика по умолчанию сигнал будет доставляться непрерывно? Также связанный с этим вопрос: есть идеи, почему breakpad не всегда восстанавливает предыдущий обработчик, а вместо этого выбирает на основе результата handled? - person black; 14.11.2019
comment
Таким образом, без явного выхода или восстановления обработчика по умолчанию сигнал будет доставляться непрерывно? - да, для определенных (не для всех) сигналов, таких как FPE, SIGV и т. д. Я не знаком с логикой/реализацией breakpad (никогда не слышал об этом до сегодняшнего дня :). Я думаю, что более естественно восстановить предыдущий обработчик, который мог быть установлен приложением. - person P.P; 14.11.2019
comment
Похоже, что breakpad предлагает выбор распространения исключения на ранее установленный обработчик во время предварительной и последующей обработки сигнала. Отсюда возможность восстановить или установить обработчик по умолчанию. - person black; 15.11.2019