Подтвердить что ты не робот

Сделать родительский wait для завершения всех дочерних процессов

Я надеюсь, что кто-то может пролить свет на то, как заставить родителя ждать завершения всех дочерних процессов, прежде чем продолжить работу над вилкой. У меня есть код очистки, который я хочу запустить, но дочерние процессы должны быть возвращены до того, как это произойдет.

for (int id=0; id<n; id++) {
  if (fork()==0) {
    // Child
    exit(0);      
  } else {
    // Parent
    ...
  }
  ...
}
4b9b3361

Ответ 1

pid_t child_pid, wpid;
int status = 0;

//Father code (before child processes start)

for (int id=0; id<n; id++) {
    if ((child_pid = fork()) == 0) {
        //child code
        exit(0);
    }
}

while ((wpid = wait(&status)) > 0); // this way, the father waits for all the child processes 

//Father code (After all child processes end)

wait ожидает завершения дочернего процесса и возвращает этот pid дочернего процесса. При ошибке (например, когда нет дочерних процессов), -1. Так, в принципе, код сохраняет не дожидаясь дочерних процессов до конца, пока не wait ошибок щих, а потом вы знаете, все они закончили.

Ответ 2

POSIX определяет функцию: wait(NULL); Это сокращение для waitpid(-1, NULL, 0); , который приостанавливает выполнение вызывающего процесса до выхода любого одного дочернего процесса. Здесь первый аргумент waitpid указывает на то, что конец любого дочернего процесса завершится.

В вашем случае родитель может вызвать его из вашей ветки else.

Ответ 3

Используйте waitpid() следующим образом:

pid_t childPid;  // the child process that the execution will soon run inside of. 
childPid = fork();

if(childPid == 0)  // fork succeeded 
{   
   // Do something   
   exit(0); 
}

else if(childPid < 0)  // fork failed 
{    
   // log the error
}

else  // Main (parent) process after fork succeeds 
{    
    int returnStatus;    
    waitpid(childPid, &returnStatus, 0);  // Parent process waits here for child to terminate.

    if (returnStatus == 0)  // Verify child process terminated without error.  
    {
       printf("The child process terminated normally.");    
    }

    if (returnStatus == 1)      
    {
       printf("The child process terminated with an error!.");    
    }
}