2016-12-01 2 views
1

Process Tree:Как сделать конкретный процесс дерева, используя вилку()

Image

Я хочу, чтобы дерево процессов, как на картинке выше. Я написал ниже код, но если вы посмотрите на PID, вы обнаружите, что есть проблема!

Мой код:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main() 
{ 
    int a ; 
    int b ; 
    int c ; 
    int d ; 
    int e ; 
    int f ; 
    int g ; 
    int h ; 
    int i ; 

    b=fork(); 

    if (b == 0) //it's child 
    { 
     d= fork(); 
     if(d==0) 
     { 
      h=fork(); 
      if(h==0) 
      { 
       i=fork(); 
       if(i==0) 
        printf("%d: I\n", getpid()); 
       else 
        printf("%d: H\n", getpid()); 
      } 
      else 
       printf("%d: D\n", getpid()); 
     } 
     else 
     { 
      e=fork(); 
      if(e==0) 
       printf("%d: E\n", getpid()); 

      else 
      { 
       f=fork(); 
       if(f==0) 
        printf("%d: F\n", getpid()); 
       else 
        printf("%d: B\n", getpid()); 
      } 
     } 
    } 
    else 
    { 
     c=fork(); 
     if(c==0){ 
      g=fork(); 
      if(g==0) 
       printf("%d: G\n", getpid()); 
      else 
       printf("%d: C\n", getpid()); 
     } 
     else 
      printf("%d: A\n", getpid()); 
    } 
    return 0; 
} 

Output (UNIX):

10201: A 
    10203: C 
    10202: B 
    10204: G 
    10207: F 
    10206: E 
    10205: D 
    10208: H 
    10209: I 

Вы можете видеть G (ИДП) = 04, а это значит, что это сделано раньше, чем D (ИДП) = 05

  • Как я могу улучшить это?
  • Другой вопрос: если какой-либо способ иметь определенный порядок печати PID, как в порядке (A, B, C, D, E, ...)?

Существует порядок, который я хотел бы создать:

 10201: A 
     10203: C 
     10202: B 
     10204: D 
     10207: G 
     10206: F 
     10205: E 
     10208: H 
     10209: I 
+1

Что случилось с тем, что G было создано до D? И разве это упражнение, или вы пытаетесь решить настоящую проблему? И для того, чтобы получить конкретный заказ, вы согласитесь разрешить процессам общаться? – Beta

+0

@Beta. Я бы создал D до G. Я отредактировал свой вопрос, посмотрю его снова. Нет Это просто упражнение. – Mehrdad

+0

Вы не указали свою проблему себе точно - вам не нужна иерархия процессов (которая, если вы напечатали идентификатор идентификатора родительского идентификатора PPID - тоже, вы обнаружите, что это правильно рассматривается как иерархия); вам также требуется, чтобы все процессы на одном уровне были созданы до любого из процессов на следующем уровне. Это можно сделать; это просто требует некоторой осторожности. Каждый процесс, который порождает другие процессы, может создать канал; дети читают на правильном конце трубы; когда родитель создал свою квоту для детей, он закрывает оба конца трубы, отправляя EOF детям, которые продолжают работу. –

ответ

1

Вы хотите, чтобы процессы, которые будут созданы в порядке {A, B, C, D, E, F, G, H, Я}.

Вы можете обеспечить это сигналами между процессами, например, вы можете отправлять через трубы. Этих трех будет достаточно:

B waits for a signal from C, before forking D 
C waits for a signal from F, before forking G 
D waits for a signal from G, before forking H 

Вам нужна помощь с сигналами?

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

  • Нет связанных вопросов^_^