2010-11-14 21 views
0

J'écris mon propre shell, mais aucune fork ne donne mon child_pid = 0 ... Qu'est-ce qui ne va pas?Comment fork() et exec() dans celui-ci?

while(true) 
    { 
     read_command(command); 

     if ((child_pid = fork()) == -1) 
     { 
      fprintf(stderr, "can't fork\n"); 
      exit(1); 
     } 
     else if (child_pid == 0) //child 
     { 
      status=execl("./myShell" command); 
     } 
     else 
     { 
      wait(status); //parent 
     } 
    } 
+1

Comment savez-vous cela? –

+0

Je ne comprends pas votre question – DerekFisher

+0

Il veut dire: comment savez-vous 'child_pid' n'est jamais 0? Avez-vous essayé de l'imprimer? – casablanca

Répondre

0

Je suppose que le (child_pid == -1) n'est pas entré ... Est-ce le père (else) branche est entré deux fois (à la fois par processus) ou quoi?

De toute façon je ne peux pas voir un bogue dans cet extrait de code. Si vous êtes sûr que votre flux d'exécution y arrive, et qu'il a un comportement imprévisible, c'est à cause d'un bug.

Je doute que glibc soit buggé sur votre système: ma meilleure estimation est que votre programme a un pointeur cassé qui a tout cassé. C'est la cause la plus commune de ce genre de comportements vraiment bizarres.

0

Votre code est OK. Ajouter une impression de débogage dans if(child_pid == 0) et assurez-vous qu'il n'est pas appelé. Si fork ne peut pas créer un enfant, il définit errno pour indiquer que l'erreur s'est produite.