我有这个代码

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;}

child 为什么会忽略SIGXCPU?代码是在FreeBsd 8.0 amd64下用gcc编译的。

最佳答案

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

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

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

关于c++ - c++限制进程子进程忽略SIGXCPU,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10402277/

10-12 17:01