2012-05-01 49 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'出错的情况下发生。 –