2016-10-19 4 views
0

Я дал следующий код:параллельных процессов с использованием вилка()

main() 
{ 
int i, rc; 
for (i = 0; i<=1; i++) 
{ 
    if((rc=fork()) == 0) 
    { 
    printf("Child %d executing\n",i); 
    } /*end if*/ 
} /*end for*/ 
} 
printf("All children created\n"); 

Я также дал решение возможных перестановок из которых может иметь место выходы.

Ребенок 0 выполняет |

Ребенок 1 выполняет | Ребенок 1 Все дети создали |

Ребенок 1 выполняет | Ребенок 2 Все дети создали |

Ребенок 1 выполняет | Grand child Все дети создали |

Все дети создали | Родитель

Я знаю, что эти результаты создаются каждым процессом, но я просто возникли проблемы отслеживания их понять КАК происходят эти выходы. Я знаю, fork() создает процесс, и if (fork() == 0) означает, что это дочерний процесс, но если кто-нибудь может помочь мне понять, где ответы за пределами Ребенок 0 выполняет | Пришли спасибо. Я считаю, что | это просто описание того, какой процесс в настоящее время выполняется. Почему child 1 может создать «великого ребенка», но ребенок 0 не может?

+0

Пожалуйста, отредактируйте свой вопрос, чтобы заменить «возможные перестановки, из которых могут произойти выходы», чем-то ясным. Обязательно четко объясните, каков последующий блок, который следует за ним. (Это своего рода искажение вывода процесса и маркировки, а имена процессов в маркировке не объясняются.) (Кроме того, «Child 1 executing» будет выводиться только дважды). См. Мой ответ. – philipxy

ответ

1

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

int rc; 

if ((rc = fork()) == 0) 
    printf("Child 0 executing\n");           

if ((rc = fork()) == 0) 
    printf("Child 1 executing\n"); 

printf("All children created\n"); 

Затем, чтобы помочь понять, что происходит, лучше всего обратить иерархию процессов в виде дерева. Вот версия ASCII его:

   main 
       /| 
      /| 
      /|\ 
      child0 | \ 
      | | \ 
      | | child1 
      /| | | 
     /| | | 
     /| | end 
     /end | 
    /  | 
    child1  end 
     |    
     |    
    end  

На графике child0 это Printf оператор отображения «Child 0 выполнения», child1 является утверждение «Ребенок 1 выполнения» и «конец» является Printf оператор отображения " Все дети созданы ».

Как вы можете видеть из графика, вы получите 1x child0, 2x child1 и 4x «Все дети созданы».

ОБНОВЛЕНИЕ @bkennedy

Вот еще один вид, который показывает вид процесса только с Р0 является основным (оригинал) процесс и «конец», указывающий каждый процесс завершение:

   P0 
       /| 
      /| 
      /|\ 
      P1 | \ 
      | | \ 
      | | P2 
      /| | | 
     /| | | 
     /| | end 
     /end | 
    /  | 
     P3  end 
     |    
     |    
    end  
  • Есть действительно 4 процесса: P0 (основной), P1, P2 и P3.
  • P1 - первый ребенок P0; он отображает «Ребенок 0 выполняет».
  • P2 - второй ребенок P0; он отображает «Ребенок 1, выполняющий». P2 никогда не создает детей, он просто заканчивается заявлением printf.
  • P3 - первый (и единственный) ребенок P1.
  • Каждый процесс отображает «Все дети, созданные», когда они заканчиваются.

Помните:

  • P0 (основной) проходит через 2 вилки звонков, следовательно, 2 детей.
  • P1 проходит через 1 вызов вилки, следовательно, единственный ребенок (P3).
  • P2 никогда не проходит через звонок вилки.

В этом нет другого процесса создания. Я не знаю, как вам это объяснить.

+0

Как получилось, что 'child0' может произвести другого ребенка, но' child1' не может? – bkennedy

+0

На графике я представил результаты различных процессов. Следовательно, оба изображенных child1 не являются одними и теми же процессами. Фактически, всего 4 процесса: main, child0, child1 (1), child1 (2). – flg

+0

Можете ли вы объяснить, почему child0 производит другой ребенок, но потом ребенок1 не может? – bkennedy

0

После первого форка и оператора if, в котором он находится, процесс «child 0 executing» и его молчащий родительский процесс переходят к следующему оператору if. Там они оба производят процесс «child 1 executing», сохраняя молчание. Все эти четыре процесса, т. Е. Основной, «процесс выполнения дочернего 0», основной «процесс выполнения дочерних 1» и процесс выполнения «дочерний 1 процесса» дочернего 0 процесса, продолжаются после второй вилки и оператора if что это, чтобы напечатать «всех детей, созданных».

Один из «Child 0 выполнения» выводится, два из «ребенка 1 выполнения» выводятся, и четыре из «Все дети, созданные» выводятся.

Каким образом ребенок 1 может создать «большой ребенок», но ребенок 0 не может?

нет «ребенок 1» создает ребенка. Основной и «ребенок» 0 каждый Creat e «ребенок 1». Вывод, по-видимому, вызывает «child 0» «child 1» «Grand child» of main. Таким образом, ни один «ребенок 1» не создает ребенка, а как основной, так и «ребенок 0» создает «ребенок 1». Таким образом, ваш вопрос неверен в отношении как «ребенка 1» (из которого их два), так и «ребенка 0».

Как эти выходы происходят

Котировочная «выход», кажется, называют основной Родителя, «ребенок 0» Дочерний процесс 0, «ребенок 1» Дочерний процесс 2 Мэйна и «ребенка 0» Процесс «ребенок 1» Процесс Великий ребенок. Таким образом, вам нужно различать, что означает «выход», именовать процессы и выводить эти процессы. Он также имеет три строки, выводящих «Child 1 executing», что неверно. Но вы должны сообщать нам что такое «выход» должен быть.

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