2012-02-19 3 views
1

У меня есть эта схема процесса, я должен сделать источник кода !!! пожалуйста, проверьте, если его правильнокод источника Fork(), процесс диаграммы

enter image description here

это мое решение для

а)

  #include <unistd.h> 
      int main(void) { 
      int i; 
      for (i= 0; i < 3; i++) 
      { 
      if(!fork()) 
      break; 
         } 

     while(wait(NULL) !==-1);//to avoid the appearance of zombies processes?? 

второе решение б):

  #include <unistd.h> 
      int main(void) { 
      int i,pid; 
      for(i=0; i<3;i++) 
      { 
       pid=fork(); 
      if (pid>0) 
       break; 
         } 
      while(wait(NULL)!=-1); 

PS: Также я должен включить комментарий, чтобы указать, где i должны включать «exec», который будет запускать каждого из детей !?

+0

Почему так много «!» И «?»? Что-то не так с вашей клавиатурой? – cnicutar

+0

Они оба ошибаются. В обеих версиях дочерний процесс будет вызывать wait(), чего вы не хотите. – wildplasser

ответ

2

В обеих программах вам необходимо рационализировать отступ и включить в конец отсутствующую скобку.

Решение (a) более или менее верна. Мы можем спорить о выборе wait() против waitpid(), и вы должны #include <sys/wait.h> объявить функцию ожидания, которую вы используете. Вы не указали, где бы вы сделали exec(), что означает, что мы не можем сказать, будете ли вы сталкиваться с проблемами с дочерними процессами, ожидающими нулевых детей, что неудобно, но не влияет на правильность. (Лично я бы написал if (fork() == 0), потому что я думаю, что это яснее, чем !fork(), тем более что возвращаемое значение 0 означает, что процесс forked успешно, тогда как !fork() читает «не fork», что довольно легко означает «не fork».

Решение (b) также более или менее корректно, за исключением того, что позиция exec() будет отличаться, и если fork() не удастся, вы выполните цикл немного дольше, чем вы должны, но опять же он вряд ли станет основным проблема Основная проблема заключается в том, «как процесс определяет, является ли это оригиналом или одним из детей»? Вы не указали контрольную информацию, которая будет необходима для различения исходного процесса и различных детей. Кроме того, если у вас есть трубы для настройки или что-то еще, что не показано.

Смежные вопросы