Проблема
Доступ к общим данным в обработчике сигналов происходит при обращении к общему объекту или изменении общего объекта в обработчике сигналов.
РискПри определении функции обработчика сигнала для доступа или изменения общего объекта обработчик получает доступ к общему объекту или изменяет его при получении сигнала. Если другая функция уже обращается к общему объекту, эта функция вызывает условие гонки и может оставить данные в несогласованном состоянии.
ЗафиксироватьЧтобы получить доступ к общим объектам или изменить их в обработчике сигналов, убедитесь, что объекты не содержат блокировок, или, если они являются целыми числами, объявите их как volatile sig_atomic_t.
Пример - int Переменный доступ в обработчике сигналов#include <signal.h>
#include <stdlib.h>
#include <string.h>
/* declare global variable. */
int e_flag;
void sig_handler(int signum)
{
/* Signal handler accesses variable that is not
of type volatile sig_atomic_t. */
e_flag = signum;
}
int func(void)
{
if (signal(SIGINT, sig_handler) == SIG_ERR)
{
/* Handle error */
abort();
}
/* Program code */
if (raise(SIGINT) != 0)
{
/* Handle error */
abort();
}
/* More code */
return 0;
}
В этом примере: sig_handler доступы e_flag, переменная типа int. Одновременный доступ другой функции может быть оставлен e_flag в несогласованном состоянии.
Исправление - объявление переменной типа volatile sig_atomic_tПеред доступом к общей переменной из обработчика сигнала объявите переменную с типом volatile sig_atomic_t вместо int. К переменным этого типа можно обращаться асинхронно.
#include <signal.h>
#include <stdlib.h>
#include <string.h>
/* Declare variable of type volatile sig_atomic_t. */
volatile sig_atomic_t e_flag;
void sig_handler(int signum)
{
/* Use variable of proper type inside signal handler. */
e_flag = signum;
}
int func(void)
{
if (signal(SIGINT, sig_handler) == SIG_ERR)
{
/* Handle error */
abort();
}
/* Program code */
if (raise(SIGINT) != 0)
{
/* Handle error */
abort();
}
/* More code */
return 0;
}