3

私はこのコードを持っています

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 でコンパイルされています。

4

1 に答える 1

3

execl現在のプロセス イメージが のアプリケーションに置き換えられるため、後の子のコードは実行されませんp1

の前にシグナルハンドラーを配置したとしても、execlオーバーライドされます。これは、exec の後にシグナルの処理がデフォルトにリセットされるためです。結局、ハンドラー関数は新しいプロセス イメージに存在しなくなります。

最後に、シグナル ハンドラを設定するには、代わりにsigactionsignalの使用を避けて使用します。

于 2012-05-01T18:31:33.990 に答える