Проблема
Вызов сигнала из обработчика сигнала происходит при вызове signal() от несуществующего обработчика сигналов на платформе Windows ®.
РискПосле захвата сигнала происходит сброс несуществующего обработчика сигнала. Обработчик не перехватывает последующие сигналы, пока обработчик не будет восстановлен вызовом signal(). Несуществующий обработчик сигналов на платформе Windows сбрасывается в значение SIG_DFL. Если другой сигнал прерывает выполнение обработчика, этот сигнал может вызвать состояние гонки между SIG_DFL и существующий обработчик сигнала. Вызов signal() может также привести к бесконечному циклу внутри обработчика.
ЗафиксироватьНе звонить signal() от обработчика сигналов на платформах Windows.
Пример - signal() Вызывается из обработчика сигналов#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
volatile sig_atomic_t e_flag = 0;
void sig_handler(int signum)
{
int s0 = signum;
e_flag = 1;
/* Call signal() to reestablish sig_handler
upon receiving SIG_ERR. */
if (signal(s0, sig_handler) == SIG_ERR)
{
/* Handle error */
}
}
void func(void)
{
if (signal(SIGINT, sig_handler) == SIG_ERR)
{
/* Handle error */
}
/* more code */
}
В этом примере определение sig_handler() включает вызов signal() при захвате обработчика SIG_ERR. На платформах Windows обработчики сигналов не поддерживаются. Этот код может привести к состоянию гонки.
Исправление - Не звонить signal() от обработчика сигналовЕсли код требует использования обработчика постоянного сигнала на платформе Windows, используйте обработчик постоянного сигнала после выполнения тщательного анализа риска.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
volatile sig_atomic_t e_flag = 0;
void sig_handler(int signum)
{
int s0 = signum;
e_flag = 1;
/* No call to signal() */
}
int main(void)
{
if (signal(SIGINT, sig_handler) == SIG_ERR)
{
/* Handle error */
}
}