2011-06-07 35 views
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類型(長),即突然它們包含隨機值。我試圖在一個小程序中查出問題,但無濟於事。 任何意見,將不勝感激。 謝謝

+0

禁用信號處理程序,看看是否仍然發生腐敗 - 也許這與信號無關。 – 2011-06-08 21:02:37

+0

事實上,它沒有計時器。這是套接字讀取代碼中的緩衝區溢出。之所以會一直存在被損壞的相同變量,是因爲該對象總是在緩衝區分配後創建的,所以無論何時緩衝區被溢出,它都會溢出到該對象上。 – Tadzys 2011-06-17 08:07:12

回答

0

您的套接字讀取代碼存在緩衝區溢出。解決這個問題,問題就會消失。