2014-02-11 4 views
1

Название говорит само за себя. Вот эта функция:Как подождать окончания дочерних процессов

void fork_and_chain(int * pipein, int * pipeout, Command *cmd, int size) 
{ 
    auto pid = fork(); 
    int status; 

    if(!pid) 
    { 
     if(pipein) { 
      dup2(pipein[0], 0); 
      close(pipein[0]); 
      close(pipein[1]); 
     } else if (cmd->redirectin) { 
      int fin = open(cmd->filename.c_str(), O_RDONLY); 
      dup2(fin, 0); 
      close(fin); 
     } 

     if(pipeout) { 
      dup2(pipeout[1], 1); 
      close(pipeout[0]); 
      close(pipeout[1]); 
     } else if (cmd->redirectout) { 
      int fout = open(cmd->filename.c_str(), O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR); 
      dup2(fout, 1); 
      close(fout); 
     } 

     if (execvp(cmd->args_char[0], cmd->args_char.data()) < 0) { 
      std::cerr << "Command not Found" << std::endl; 
     } 
    } else if (pid < 0) { 
     std::cerr << "Fork failed." << std::endl; 
     exit(1); 
    } else { 
     // waiting for child process to finish 
    } 
} 

Что бы я там ни разместил, я получаю бесконечный цикл (я делаю оболочку). Я либо получаю подсказку «cmd» бесконечно, либо ничего вообще. Код цепочки продолжает работать, и я не знаю, как hot его прекратить.

ответ

1

Я думаю, что вы ищете waitpid(). В вашем разделе комментариев добавить:

int status = 0; 
waitpid(pid, &status, 0); 
std::cerr << "child finished with status: " << status << std::endl; 
Смежные вопросы