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

Linux 使用SIGALRM和计时器时内存损坏,linux,memory,gcc,signals,corruption,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

好的,我不确定这是内存损坏还是代码中的错误,但下面是问题的描述: 单线程程序注册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_函数是一个调用对象函数的简单函数:

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

tick()
{
    ++variable;
}
变量的类型为long。 我的程序只有一个_对象的实例,只有信号处理程序调用函数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次。现在的问题是,我间歇性地得到对象的其他数据成员,一些对象损坏了,它们是POD类型的,也就是说,它们突然包含了随机值。我试图在一个小程序中隔离一个问题,但没有成功。 如有任何建议,将不胜感激。
谢谢

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

禁用信号处理程序,看看是否仍然发生损坏-可能与信号无关。事实上,与计时器无关。这是套接字读取代码时的缓冲区溢出。为什么总是有相同的变量被破坏,是因为这个对象总是在缓冲区分配之后创建的,所以每当缓冲区溢出时,它就会溢出到那个对象。。。