2013-12-09 4 views
1

Я пытаюсь сделать вилку, которая запускает exec в одном файле, а затем ждет завершения. Если exec в дочернем процессе завершается сигналом, я хочу распечатать сигнал, если программа занимает слишком много времени для выполнения, я хочу распечатать таймаут.waitpid not working- efault error

 pid_t pid; 
     pid = fork(); 

     if(pid == 0) { 
      //child process 
     } 
     else { 
      alarm(timeout); 
      int status; 
      if(wait(pid, &status, 0) == pid) { 
       alarm(0); 
       fpw = fopen(testreport, "a+"); 
       if(WIFSIGNALED(status)) { 
        fprintf(fpw, "Run time errors: signal %d\n", WTERMSIG(status); 
       } 
       else { 
        fprintf(fpw, "Run time errors: none"); 
       } 
       fclose(fpw); 
      } 
      else { 
       alarm(0); 
       kill(pid, SIGTERM); 
       fpw = fopen(testreport, "a+"); 
       fprintf(fpw, "Run time errors: timeout\n"); 
       fclose(fpw); 
      } 
     } 

Testreport - это ранее объявленный символ * для имени файла. Однако waitpid не работает. Когда я печатаю значение waitpid и возвращаемое значение errno, я получаю -1 и 14 соответственно. Я искал errno 14, и это EFAULT, который указывает, что адрес статуса недействителен. Как это может быть так?

ответ

0

Предложения:

  1. добавить -Wall ваших Gcc параметров.

  2. Подробнее об ошибке. В ваших кодах fork() может возвращать -1, а -1 - действительный ввод для waitpid, что может быть связано с различным поведением.

1

Проблема, скорее всего, эта линия:

 if(wait(pid, &status, 0) == pid) { 

Здесь вы вызываете wait() который принимает только один параметр. Похоже, вы намеревались называть waitpid(), который принимает три параметра (также в заголовке вопроса вы спрашиваете о waitpid()). Если вы вызываете wait() с тремя параметрами, результаты могут быть непредсказуемыми и могут привести к проблемам, которые вы наблюдаете.