2011-12-13 124 views
1

在我signal.h中的文件我已經添加了一個信號處理程序是這樣的:集分割故障處理程序

#define SIG_WPG ((__sighandler_t)3) 

,然後在signal.c實現這樣的:

if (ka->sa.sa_handler == SIG_WPG) { 
     unsigned long ul_cr2 = current->tss.cr2; 
     unsigned long ul_eip = (unsigned long) regs->eip 
     int ul_cr2_rounded = ul_cr2 & PAGE_MASK; 
     printk("ul_eip: %d\n", ul_eip); 
     printk("ul_cr2: %d\n", ul_cr2); 
     printk("ul_cr2_rounded: %d\n", ul_cr2_rounded); 
    } 

我怎樣才能使這個信號處理程序處理用戶空間中的分段錯誤?

回答

1

的解決方案是定義:

static struct sigaction segv_action 

,然後設置:

segv_action.sa_handler = SIG_WPG; 

這是爲了一個大學項目,這些變化是在我們從學校獲得的.c文件中完成的,所以在那裏可能是我不知道的其他需要的細節。

4

可以使用signal()方法註冊一個回調是例外:

//callback prototype 
void Handler(int sig); 

//register the callback for the specific signal 
signal(SIGSEGV,&Handler); 
+0

你能舉個例子嗎?我嘗試了信號(SIG_WPG);這給了我一個關於在沒有強制轉換的情況下從指針開始整數的錯 – JacobOJ

+0

@JacobOJ你試過我的建議嗎?順便說一句,信號用於註冊回調,而不是發送信號給應用程序。 –

+0

我不知道如何使用它。處理程序如何知道如何使用SIG_WPG? – JacobOJ