c ++限制进程子忽略SIGXCPU

时间:2012-05-01 18:26:00

标签: c++

我有这段代码

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编译的。

1 个答案:

答案 0 :(得分:3)

execl之后的子代码永远不会被执行,因为当前的过程映像被p1中的应用程序替换。

即使您将信号处理程序置于execl之前,它也会被覆盖,因为在exec之后信号处置会重置为默认值。毕竟,新的过程映像中将不再存在处理函数。

最后,要设置信号处理程序,请避免使用signal并使用sigaction