исходный код Fork (), процесс Diagram - PullRequest
1 голос
/ 20 февраля 2012

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

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: Также я должен включить комментарий, чтобы указать, куда я должен включить «exec», который будет запускать каждого из детей!?

1 Ответ

2 голосов
/ 20 февраля 2012

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

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

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

...