Повреждение памяти при использовании SIGALRM и таймера - PullRequest
0 голосов
/ 08 июня 2011

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

struct sigaction action;
sigset_t blocked;

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

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

// We are not interested in the previous action:
if (sigaction(SIGALRM, &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, &timer, NULL) == -1)
...

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

1 Ответ

0 голосов
/ 30 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...