C++ 限制进程子项忽略 SIGXCPU

c++ limit process child ignore SIGXCPU

本文关键字:SIGXCPU 进程 C++      更新时间:2023-10-16

我有这个代码

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

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

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

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