Вопрос

Я знаю вилку (), ждать (), waitpid (), зомби процессов ... Я понял их, читая У. Ричард Стивенс, которая очень хорошая книга.

Если мы не будем звонить ждать () у родителей, ребенок становится зомби после прекращения ... что плохое!

Если мы позвоним ждут () у родителя, тогда родитель ждет ребенка для завершения, получает статус завершения, а затем продолжается. Напишите?

Я прошел через много примеров, которые вызывают вилку () один раз, а затем ждать () в родительском языке.

Но если у всех родителей будет ждать ребенка и продолжать после того, как ребенок завершает, то нет фактической многозадачности (технически да, есть 2 процесса. Но логически бесполезно использовать), то почему мы назвали вилкой () Вот?

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

Спасибо!

Это было полезно?

Решение

Иногда полезно fork () , даже если родитель сразу будет заблокировать.Наиболее распространенным делом является, когда вы делаете что-то похожее на систему System () Call, выполняя внешнюю команду и ждем ее, чтобы завершить: вы будете делать FORK () + + execive () .(Хотя в современном коде вы должны рассмотреть возможность использования posix_spawn () для этой цели.)

Тем не менее, <сильные> ждать () не нужно блокировать.Вы можете использовать WEITPID () с флагом WNOHANG для сбора кода выхода из любого заполненного процесса или непосредственно, если он все еще работает.

Другие советы

Код, который вы пишете между 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;
   }
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top