0
好真的不知道,如果它是內存損壞或只是在我的代碼中的錯誤,但這裏是問題的描述: 單線程程序註冊一個SIGALRM處理程序:內存損壞使用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;
}
變量是類型長的。 我的程序只有一個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類型(長),即突然它們包含隨機值。我試圖在一個小程序中查出問題,但無濟於事。 任何意見,將不勝感激。 謝謝
禁用信號處理程序,看看是否仍然發生腐敗 - 也許這與信號無關。 – 2011-06-08 21:02:37
事實上,它沒有計時器。這是套接字讀取代碼中的緩衝區溢出。之所以會一直存在被損壞的相同變量,是因爲該對象總是在緩衝區分配後創建的,所以無論何時緩衝區被溢出,它都會溢出到該對象上。 – Tadzys 2011-06-17 08:07:12