2017-09-26 6 views
0

J'essaie de créer un arbre de processus, mais voici ce que ma sortie est en ce moment: https://gyazo.com/a71f4e095b69080a6d6a11edd2c0df27 Le problème est que je veux faire ressembler le diagramme que j'ai dessiné sur la droite, mais peut ne semble pas comprendre comment. J'imprime chaque ID de parent de processus d'enfant et après cela je vais les supprimer commençant par 2, puis 1 (en envoyant un signal de SIGKILL après 5 secondes). Comment puis-je faire ressembler l'arbre de processus au résultat souhaité? Voici mon code:C Aide à la création d'un arbre de processus

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 


int main() 
{ 
    int root, t1, t2, i; 

    root = getpid(); 
    printf("root %d\n", root); 
    for (i = 1; i < 3; i++) 
    { 
     t1 = fork(); 
     //printf("%d\n", t1); 
     if(t1!=0) 
     { 
     t2 = fork(); 
     } 
     if (t1 !=0 && t2 != 0) 
     { 
      break; 
     } 

     printf("child pid %d parent pid %d\n", getpid(), getppid()); 
    } 
    sleep(10); 

    return 0; 
} 

Merci!

Répondre

0

Votre boucle for principale est exécutée dans toutes les fourches, ce qui ne correspond pas à votre diagramme. Qu'est-ce que vous voulez réellement est que vos déclarations ont si la même structure que votre arbre:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 


int main() 
{ 
    printf("root %d\n", getpid()); 

    if (fork()) 
    { 
     fork(); 
    } else { 
     if (fork()) 
     { 
      if (fork()) 
      { 
       fork(); 
      } 
     } 
    } 

    printf("child pid %d parent pid %d\n", getpid(), getppid()); 

    fflush(stdout); 

    sleep(10); 

    return 0; 
} 

Cela donne le résultat souhaité:

root 5140 
child pid 5140 parent pid 377 
child pid 5147 parent pid 5141 
child pid 5149 parent pid 5141 
child pid 5146 parent pid 5140 
child pid 5148 parent pid 5141 
child pid 5141 parent pid 5140 

NB. le sleep() est de s'assurer qu'aucun des processus ne sortira avant leurs enfants, à quel point leurs enfants seraient reparti pour avoir ppid = 1 (init).

+0

Et si je voulais les supprimer du bas vers le haut (donc supprimer tous les processus enfants de 2 puis tuer 1) Comment ferais-je cela? Est-ce que j'utiliserais SIGKILL? J'ai essayé deux fois de lancer SIGKILL, mais il ne fait qu'imprimer une fois "tué", puis il quitte le programme et je ne suis pas sûr de savoir comment vérifier qu'il a fait ce que je voulais. –