2017-03-09 2 views
1

J'appelle fork() deux fois pour créer deux processus enfants. Je veux que le processus fils A fasse un appel à exec() et que le processus fils B fasse aussi un appel à exec(). Le problème que j'ai avec le code donné est qu'après le premier exec() du processus fils A, le prochain fork() ne semble pas se produire et le programme se termine. Je pense que cela a à voir avec la façon dont exec() recouvre le processus parent. Ce que je veux accomplir est d'appeler exec() de chacun des processus enfants créés par fork().fork() et exec() Deux processus enfants

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <sys/wait.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <iostream> 

int main() { 

pid_t cpid_a, cpid_b; 

cpid_a = fork(); 
if(cpid_a < 0) { 
    std::cout << "Fork failed." << '\n'; 
    return 1; 
} 
else if(cpid_a == 0) { // code for child process A 
    execlp("/bin/ls", "ls", NULL); 

    cpid_b = fork(); 
    if(cpid_b < 0) { 
     std::cout << "Fork failed." << '\n'; 
     return 1; 
    } 
    else if(cpid_b == 0) { // code for child process B 
     execlp("/bin/ls", "ls", NULL); 
    } 
} 
else { // code for parent process 
    while(wait(NULL) != -1); 
} 
return 0; 
} 
+0

Si 'execlp' renvoie, c'est seulement parce qu'il a échoué. Vous ne devriez jamais avoir de code après un appel à execl qui fait quoi que ce soit sauf gérer une erreur. –

+0

IOW, votre enfant devrait appeler execl, et le parent devrait appeler 'fork' une seconde fois. –

Répondre

1
else if(cpid_a == 0) { // code for child process A 
    execlp("/bin/ls", "ls", NULL); 

Si cela appelle réussit, la déclaration suivante, et rien qui suit ne sera jamais exécutée. Voilà comment fonctionne exec(). Le fork() immédiatement suivant ne se produit jamais. C'est simplement comment fonctionne exec(). Si exec() réussit, il ne revient jamais. Le processus de remplacement est exécuté à sa place.

Vous avez même ajouté le commentaire 100% correct, ci-dessus: "code pour le processus enfant A". Tout à l'intérieur de l'instruction if() est "code pour le processus enfant A" et est exécuté lorsque fork() renvoie 0.

Vous avez également indiqué correctement que vous souhaitez que le processus parent exécute un deuxième processus. Eh bien, vous devez avoir que Code évidemment s'exécuté par le processus parent, et non le processus de l'enfant:

else if(cpid_a == 0) { // code for child process A 
    execlp("/bin/ls", "ls", NULL); 
    exit(1); 
} else { 
    cpid_b = fork(); 

    // The rest of the code. 

Maintenant, le processus parent va de l'avant et fork() une seconde fois, continuâmes le reste de votre plan.

P.S. Le exit() est juste pour une bonne mesure. La seule heure exec() renvoie lorsque exec() ne parvient pas à exécuter le processus donné. Très improbable, dans le cas de /bin/ls; S'il vous manque, vous avez de plus gros problèmes à vous faire. Pourtant, c'est la chose techniquement correcte à faire, puisque la poursuite de l'exécution à ce moment-là entraînera un chaos complet. Encore une fois, si /bin/ls est manquant cela va être le moindre des problèmes, mais cela peut aussi arriver si, disons, le système manque de mémoire et ne peut pas l'exécuter pour cette raison; Dans ce cas, il n'y a pas besoin d'ajouter du carburant à l'incendie. mais plutôt faire mourir le processus de toute façon.