#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:
В коде чтения вашего сокета происходит переполнение буфера. Исправьте это, и проблема исчезнет.