使用SIGALRM和计时器时内存损坏

时间:2011-06-07 22:39:16

标签: linux memory gcc signals corruption

确定不确定是内存损坏还是我的代码中的错误,但这里是问题的描述: 单线程程序注册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类型(长),即它们突然包含随机值。我试图在一个小程序中隔离一个问题,但无济于事。 任何建议将不胜感激。 感谢

1 个答案:

答案 0 :(得分:0)

套接字读取代码中存在缓冲区溢出。解决这个问题,问题就会消失。