2011-09-28 2 views
1

lorsque je cours mon code ci-dessous et tapez "ls" à l'invite, il lance ls dans le terminal, mais se trouve juste là et ne imprime pas mon invite à nouveau. Comment obtenir le contrôle pour revenir au processus parent?après le contrôle fork/execvp ne retourne pas au parent

Merci

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

int main(int argc, char* argv[]){ 
    while(1){ 
     print_the_prompt(); 
     char user_text[100]; 
     if(fgets(user_text, sizeof(user_text), stdin) != NULL){ 
      char* nl_char = strchr(user_text, '\n'); 
      if(nl_char != NULL){ 
       *nl_char = '\0'; 
      } 
     } 

    //printf("user_text = \"%s\"\n", user_text); 

     if(is_command_built_in(user_text)){ 
      //run built in command 
     } 
     else{ 
      //run regular command 
      execute_new_command(user_text); 
     } 
    } 

    return 0; 
} 

void print_the_prompt(){ 
     printf("!: "); 
} 

int is_command_built_in(char* command){ 
    return 0; 
} 

void execute_new_command(char* command){ 
    pid_t pID = fork(); 
    if(pID == 0){ 
     //is child 
     char* execv_arguments[] = { command, (char*)0 }; 
     execvp(command, execv_arguments); 
    } 
    else{ 
     //is parent 
     printf("im done"); 
    } 
} 

Répondre

1

La réponse est sans doute que les impressions des parents « im fait » immédiatement après à partir l'enfant (rappelez-vous que c'est un processus distinct et fonctionne donc en parallèle), et puis reboucle autour de imprimez l'invite avant même que l'enfant commence à lister les fichiers. Si vous revenez en arrière, vous trouverez probablement votre prochaine invite. Pour que le parent attende la fin de l'enfant, vous devez utiliser une famille de fonctions wait().

+0

oooooh ok. Je ne savais pas sur wait(). Je vais regarder dans cela. Vous aviez raison, il imprimait "j'ai fini" avant d'imprimer les choses de ls. – james

Questions connexes