2013-06-27 2 views
0

Итак, я искал все это через stackoverflow и определенно искал поисковые запросы в течение полчаса, но ответы, которые, как мне кажется, почти не имеют никакого отношения к тому, что я на самом деле хочу сделать, надеюсь, кто-то поможет мне в этом, Херес код:Вилка двоичного дерева, проблема с функцией вилки

int cCount = 0; 

while(cCount < 2) 
{ 
    switch(fork()) 
    { 
    case 0: 
    cCount++; 
    break; 

    case -1: 
    printf("Failed"); 
    break; 

    default: 
    break; 
    } 
} 

return; 

Теперь вопросы, которые возникают, этот код предположим, чтобы создать дерево, которое имеет 3 уровня (0,1,2) ,

0 является первичным родителем, с которого начинается разветвление

1 2 Дети быть материнского в 0

2 является 4 Childs из 2 родителей в 1

Создание симметричного дерева. По существу, хотя у меня есть несколько вопросов:

  1. коммутатор выполняет вилку на каждом цикле, так что в теории, если вилка> 0, то все равно будет раздвоенный создание суб ребенка для родителя, и петля будет продолжать идти, поэтому это может быть связано с родительским родителем-родителем-цепочкой, а не с двумя детьми на одного родителя, затем с 4 на 2 и т. д. Как вилка знает, что делать?

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

Я правильно понимаю вилку? Пожалуйста, объясните, если нет, то довольно много учебников по сети, но все они, похоже, делают это более сложным, чем это могло бы быть.

Привет, спасибо И будьте добры ко мне, английский не мой родной язык.

ответ

0

Этот код будет в основном вилка бомба, и вот почему:

Когда процесс попадает в первый fork, он будет возвращать 0 для ребенка, и положительное число (PID ребенка) для родителей , Таким образом, родительский экземпляр cCount никогда не будет увеличиваться, поэтому цикл будет работать вечно.

+0

Приятно знать, что я разработал DoS, всегда удобен. В этом случае, как вы называете вилку внутри раздвоенного ребенка. Потому что, если вы вызываете только fork(), он будет разветвлять только родителя. –

+0

Что вам нужно сделать, так это обмен файлами вокруг, поэтому строка 'cCount ++;' находится в блоке 'default:', а не в блоке 'case 0:'. Кроме того, вы должны добавить строку 'cCount = 0;' в блок «case 0:». Чтобы не зацикливаться на нем, вам понадобится переменная 'level', которая начинается с нуля и будет увеличиваться сразу после строки' cCount = 0; ', о которой я только что упомянул. Затем вы можете использовать эту переменную, чтобы определить, следует ли продолжать форкирование. –