2012-05-24 6 views
1

Это фрагмент из моей программы, которая работает, но машина, которая корректирует его пытается это:Ожидание дочернего процесса

strace ./watcher echo 2>&1 > /dev/null | grep wait | cut -c1-4 

Ожидаемый результат:

wait 

Но моя программа печатает случайное число ждет (как это):

wait 
wait 
wait 
wait 
wait 
wait 

Это код:

// creates a child process 
    pid_t process_id; 
    int status; 
    process_id = fork(); 
    switch(process_id) 
    { 
     case -1: // Error while making the forkFork failed 
      fprintf(stderr, "Fork failed.\n"); 
      break; 

     case 0: // Child process. 
      execvp(command[0], command); // command here is char** 

      // execvp only returns when error. 
      Error(argv[0], 1); // Error just prints the error 
      exit(1); 
      break; 

     default: // Parent process. 
      while(!waitpid(process_id, &status, WNOHANG)); 
      finished(status); // It prints how the process has finished. 
    } 

Я думаю, что проблема заключается в том, что, хотя с waitpid внутри, это вызывает много ожиданий. Но если я удалить его и оставить waitpid в покое, я получаю этот выход:

standard input: Input/output error 

Есть ли способ сделать только один звонок ожидания, не получая эту ошибку?

+0

Попробуйте избавиться от выхода (1) –

ответ

2

Вы можете попробовать не комплект WNOHANG по телефону waitpid().

Это сделало бы waitpid() блоком до тех пор, пока ребенок не закончит работу.