Повреждение памяти при использовании SIGALRM и таймера

#linux #memory #gcc #signals #corruption

#linux #память #gcc #сигналы #повреждение

Вопрос:

Хорошо, не совсем уверен, является ли это повреждением памяти или просто ошибкой в моем коде, но вот описание проблемы: Однопоточная программа регистрирует обработчик SIGALRM:

 struct sigaction action;
sigset_t blocked;

sigfillset(amp;blocked);
sigdelset(amp;blocked, SIGKILL);
sigdelset(amp;blocked, SIGSTOP);

action.sa_handler = amp;handler_function;
action.sa_flags   = SA_RESTART;
action.sa_mask    = blocked;

// We are not interested in the previous action:
if (sigaction(SIGALRM, amp;action, NULL) == -1)
   ....
  

handler_function — это простая функция, которая вызывает функцию объекта:

 void handler_function()
{
     some_object->tick();
}

tick()
{
      variable;
}
  

Переменная имеет тип long.
в моей программе есть только один экземпляр some_object, и только обработчик сигналов вызывает функцию tick, и только функция tick изменяет переменную. Другие функции считывают только значение переменной.
Забыл упомянуть, что я создаю таймер:

 struct timeval interval;
interval.tv_sec   = 0;
interval.tv_usec  = (100000);

struct itimerval timer;
timer.it_interval = interval;
timer.it_value    = interval;
if (setitimer(ITIMER_REAL, amp;timer, NULL) == -1)
...
  

таким образом, функция tick запускается 10 раз в секунду. Теперь проблема в том, что периодически я получаю поврежденные другие элементы данных объекта some_object, они являются типами POD (long), то есть внезапно они содержат случайные значения. Я пытался изолировать проблему в небольшой программе, но безрезультатно.
Любой совет был бы оценен.
Спасибо

Комментарии:

1. Отключите обработчик сигналов и посмотрите, по-прежнему ли происходит повреждение — возможно, это не имеет никакого отношения к сигналам.

2. Действительно, с таймером ничего не было общего. Это было переполнение буфера в коде чтения сокета. Причина, по которой все время были повреждены одни и те же переменные, заключалась в том, что этот объект всегда создавался после выделения буфера, поэтому всякий раз, когда буфер был переполнен, он переполнялся к этому объекту…

Ответ №1:

В коде чтения вашего сокета происходит переполнение буфера. Исправьте это, и проблема исчезнет.