2016-09-15 1 views
1

Je suis en train de faire une ferme de processeur C. Je commence par les files d'attente de message d'ouverture, et essayer ensuite de faire des processus de travail: (notez que NROF_WORKERS est 5)Seulement 1 enfant après 5 fourchettes (C)

static void 
makechildren (void) { 
    // Only the parent should fork. Any children created will become workers. 
    pid_t processID; 
    pid_t farmerPID = getpid(); // To identify who the farmer is 

    // Loop creating processes, indexed by NROF_WORKERS 
    int i = 0; 
    while (i < NROF_WORKERS){ 
     if (getpid() == farmerPID){ 
      i++; 
      printf ("Parent is creating a child!%d\n", getpid()); 
      processID = fork(); 
     } 
    } 

    if (processID < 0){ 
     perror("fork() failed"); 
     exit(1); 
    } 
    else { 
    // If parent, start farming 
     if (processID == farmerPID) { 
      printf("Parent reporting in!%d\n"); 
     } 
    // If child, become a worker 
     if (processID == 0) { 
      printf("Child reporting in!%d\n", getpid()); 
      join(); 
     } 
    } 
} 

Comme vous pouvez le voir, je veux que le parent signale chaque fois qu'un enfant est créé, et ensuite je veux que le parent et tous les enfants à signaler. Cependant, cela est tout ce que je reçois:

Parent is creating a child!11909 
Parent is creating a child!11909 
Parent is creating a child!11909 
Parent is creating a child!11909 
Parent is creating a child!11909 
Child reporting in!11914 

Maintenant, je fais remarquer la différence de 11909 et 11914 est 5. Donc, ma question: sont les autres processus créés? Si oui, comment se fait-il qu'ils ne rapportent pas? Et si non, qu'est-ce que je fais de mal? En outre, le parent ne rapporte pas du tout, comment cela est-il causé?

Répondre

2

Tous les enfants sont créés, mais la boucle pour toujours dans la boucle while, comme i est incrémentée seulement pour le parent:

int i = 0; 
while (i < NROF_WORKERS){ 
    if (getpid() == farmerPID){  
     i++;    // <---- This is happening for the parent process only. 
     printf ("Parent is creating a child!%d\n", getpid()); 
     processID = fork(); 
    } 
} 

Le seul enfant de mettre fin est le dernier, pour lequel le i est égal à NROF_WORKERS.

également parent est « pas d'information » depuis le processID vous extrayez être égal au PID parent est jamais égal, car il est égal au dernier fork résultat, à savoir le dernier enfant créé PID:

......... 
processID = fork(); 
......... 
......... 
if (processID == farmerPID) { 
      printf("Parent reporting in!%d\n"); 
} 
0

Vous imprimez toujours le farmerPid! Mais comme le message est imprimé 5 fois, vous effectivement créé 5 processus:

while (i < NROF_WORKERS){ 
    if (getpid() == farmerPID){ 
     i++; 
     printf ("Parent is creating a child!%d\n", getpid()); 
     processID = fork(); 
    } 
} 

Si vous souhaitez imprimer les pid alors votre must code des enfants fait une différence entre les parents et les enfants, comme dans:

while (i < NROF_WORKERS){ 
    if (getpid() == farmerPID){ 
     i++; 
     printf ("Parent is creating a child!\n"); 
     processID = fork(); 
     if (processID==0) { // child 
      printf("I am the child %d\n",getpid()); 
     } else { // parent 
      printf("Parent just created child %d\n",processID); 
     } 
    } 
}