Почему мы используем wait при создании дочерних процессов?

Я новый программист на C ++ и пытаюсь понять, как работает родитель и процессы. Для этого я попытался создать три процесса на основе кодов здесь. Однако я понимаю, что мы должны выходить после создания наших дочерних процессов каждый раз, чтобы разрешить другие дочерние процессы, но я не понимаю, что во втором цикле for мы ожидаем (NULL) три раза. Зачем мы это делаем? Я впервые пытаюсь понять родительский и дочерний процесс. Я был бы рад, если бы вы дали мне источник для изучения. Спасибо!

int main(){

cout<<" Dad process is "<<getpid()<<endl;

for(int i=0;i<3;i++){
if(fork()==0)
{
cout<<"Son pid "<<getpid()<<" from pid "<<getppid()<<endl;
exit(0);
}
}
for(int i=0;i<3;i++){
wait(NULL);
}

}

`

0

Решение

Без wait() вызовите, родительский процесс немедленно прекратит работу, в то время как дочерние процессы могут продолжить работу.

Для короткой, короткой программы, подобной показанной здесь, это не имеет большого значения.

Но для более крупного и более сложного приложения, где дочерние процессы выполняют существенную работу: завершение родительского процесса может привести к путанице. Создается впечатление, что только что выполненный процесс завершен своей работой. Вы вернулись в командной строке / командной строке, не зная, что дочерние процессы все еще делают все, что делают.

Кроме того, если один из дочерних процессов сталкивается с ошибкой и завершается с ненулевым кодом выхода, wait()Этот родительский процесс может собирать код выхода и завершать себя ненулевым кодом выхода, что указывает на сбой процесса.

1

Другие решения

Цитата из https://linux.die.net/man/2/wait :

…используется для ожидания изменения состояния дочернего процесса вызывающего процесса, и
получить информацию о ребенке, состояние которого изменилось. Штат
Изменение считается: ребенок прекращен …

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

0

Когда вы вызываете wait (NULL), вы просите ОС дождаться «изменения состояния» в любом дочернем процессе. Изменение состояния включает в себя переход ребенка из состояния бега в состояние выхода.

Вам, вероятно, следует вместо этого вызывать waitpid (childid), чтобы вы точно знали, какого ребенка вы ждете. Другими словами:

int child_id = fork();
if (child_id == 0)
{
/* do useful child work */
}
else
{
waitpid(child_id, ...);
}

Зачем ждать ребенка?

Во-первых, вы обычно просите детей выполнять полезную работу и хотите знать, когда они закончат.

Другая причина заключается в том, что ОС должна сохранять некоторые данные для этого процесса, даже если он завершился, до вызова wait (). Поэтому, не вызывая wait, ваши дети в конечном итоге превращаются в процессы «зомби» (вы увидите их в top).

Вы можете увидеть некоторые типичные реальные применения здесь:
https://github.com/deplinenoise/tundra/blob/master/src/ExecUnix.cpp#L102

И документы вы можете найти здесь:
https://linux.die.net/man/2/wait

0
По вопросам рекламы [email protected]