Почему вилку (), а затем ждать () в родителе?
-
11-12-2019 - |
Вопрос
Я знаю вилку (), ждать (), waitpid (), зомби процессов ... Я понял их, читая У. Ричард Стивенс, которая очень хорошая книга.
Если мы не будем звонить ждать () у родителей, ребенок становится зомби после прекращения ... что плохое!
Если мы позвоним ждут () у родителя, тогда родитель ждет ребенка для завершения, получает статус завершения, а затем продолжается. Напишите?
Я прошел через много примеров, которые вызывают вилку () один раз, а затем ждать () в родительском языке.
Но если у всех родителей будет ждать ребенка и продолжать после того, как ребенок завершает, то нет фактической многозадачности (технически да, есть 2 процесса. Но логически бесполезно использовать), то почему мы назвали вилкой () Вот?
Мы могли бы написать код ребенка, а затем код родителей вместо вилки () и ждать () как один процесс ... не будет лучше?
Спасибо!
Решение
Иногда полезно fork () , даже если родитель сразу будет заблокировать.Наиболее распространенным делом является, когда вы делаете что-то похожее на систему
Тем не менее, <сильные> ждать () не нужно блокировать.Вы можете использовать
Другие советы
Код, который вы пишете между fork()
и waitpid()
, работает одновременно, рядом с детской вилкой.
Родитель ждет до того, как ребенок не закончится, часто просто для забрать данные, доставляемые у ребенка и настоящим выставляем его родителю. Предположим, вы запускаете основной цикл, где задачи выполняются как «Фон».Например:
// a simple scheduler
while(1) {
if(done_task_1) {
// if done_task_1 is ever to change in the parent memory scope,
// parent must know the exit status of its child fork.
// otherwise there is no way to enter this if sentance, ever
collect_data_1();
run_task_1 = 0;
}
else if(run_task_1 == 1) {
// iterate instructions for a sec
posix_kill(pid_task_1, SIGCONT);
sleep(1);
posix_kill(pid_task_1, SIGSTOP);
}
if(done_task_2) {
collect_data_2();
run_task_2 = 0;
}
else if(run_task_2 == 1) {
// iterate instructions for a sec
posix_kill(pid_task_2, SIGCONT);
sleep(1);
posix_kill(pid_task_2, SIGSTOP);
}
if(run_task_1 == 0 && run_task_2 == 0) {
break;
}
}
.