Сделать родительский wait для завершения всех дочерних процессов
Я надеюсь, что кто-то может пролить свет на то, как заставить родителя ждать завершения всех дочерних процессов, прежде чем продолжить работу над вилкой. У меня есть код очистки, который я хочу запустить, но дочерние процессы должны быть возвращены до того, как это произойдет.
for (int id=0; id<n; id++) {
if (fork()==0) {
// Child
exit(0);
} else {
// Parent
...
}
...
}
Ответы
Ответ 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!.");
}
}