2012-05-01 72 views
2

我有這樣的代碼C++限制處理,孩子忽略SIGXCPU

static void sigXCPU(int pTmp){ 
    cout<<" .... "; 
} 

..... 
pid_t vPid=fork(); 
    int vStat; 

    switch(vPid){ 
    case -1: perror("fork"); 
    exit(1); 
    case 0: 
    //limit on data 
    struct rlimit vLimD; 
    vLimD.rlim_cur = 100000; 
    vLimD.rlim_max = 1000000; 
    setrlimit(RLIMIT_DATA, &vLimD); 
    //limit on cpu time 
    struct rlimit vLimCPU; 
    vLimCPU.rlim_cur = 1; 
    vLimCPU.rlim_max = 1; 

    execl("./p1","",NULL);  
    if(signal(SIGXCPU,sigXCPU)==SIG_ERR); 
    break; 
    default: 
    while(wait(&vStat)!=vPid); 
    break;} 

和P1的代碼是

int main(){ 
    sleep(10); 
return 0;} 

爲什麼孩子忽略SIGXCPU?代碼是在FreeBSD 8.0 AMD64使用GCC編譯。

回答

3

execl後的孩子中的代碼永遠不會執行,因爲當前的進程映像替換爲p1應用。

即使您將信號處理程序放在execl之前,它也會被覆蓋,因爲信號處置會在執行後重置爲其默認值。畢竟,你的處理函數將不再存在於新的過程映像中。

最後,建立一個信號處理程序,避免使用signal和使用sigaction,來代替。

+1

+1。特別是對於編輯,您添加了「固定」(用引號引起來)代碼的討論,因此在調用'execl'之前調用'signal'。 –

+0

@David,我還建議使用'sigaction'而不是'signal'來增加一個處理程序,本着進一步教育的精神。 –

+0

看到了。並不是說它會幫助解決這個問題。對於xnl96:調用'exec'後應該只有一個代碼是對'exit'的調用,可能在前面添加了一條錯誤消息。從'exec'返回只會在'exec'出錯的情況下發生。 –