2017-02-26 1 views
1

Je veux écrire un interprète de ligne comamnd avec plusieurs commandes par ligne.interpréteur de ligne de commande avec plusieurs commandes par ligne

J'ai écrit un programme en C qui fonctionne pour 1 comamnd par ligne mais si j'entre plus de commandes ne fonctionnent pas, les comamnds sont entrées comme: ls -l; pwd; fichier de chat; ls.

d'abord, je parse args, je les mettre en réseau et le i cette fonction:

pid_t pid; 
pid = fork();  

switch(pid) { 
    case -1: 
     printf("DEBUG:Fork Failure\n"); 
     exit(-1); 
    case 0: 
     execvp(cmd[j], cmd); 

     if(execvp(cmd[j], cmd) == -1) { 
      printf("Command Not Found\n"); 
      exit(0); 
     } 

    default: 
    wait(NULL); 
    printf("DEBUG:Child Finished\n"); 
} 

Mon analyseur est:

printf("shell> "); 

fgets (input, MAX_SIZE, stdin); 

if ((strlen(input)>0) && (input[strlen (input) - 1] == '\n')) { 
    input[strlen (input) - 1] = '\0'; 
} 


printf("INPUT: %s\n", input); 

cnd = strtok(input, " ;"); 

int i = 0; 

while(cnd != NULL) {  
    cmd[i] = cnd; 
    i++; 
    cnd = strtok(NULL, ";"); 

Je pense que je dois utiliser des tuyaux pour résoudre mon problème ,mais comment ? Des idées?

désolé pour mauvais anglais

+0

Si une commande est correctement analysée, mais que plusieurs commandes ne le sont pas, il y a un problème avec votre analyseur. Vous ne montrez pas votre analyseur ... – StoryTeller

Répondre

0

La façon dont vous l'expliquer, il semble que vous voulez exécuter les commandes un après l'autre, mais pas les communiquer entre eux (en plus, redirigeant la sortie de ls à pwd n'a tout simplement aucun sens). Pour cela, la solution est simple: diviser l'entrée sur le point-virgule, et gérer chaque commande comme une seule commande (puisque c'est ce que c'est).

Avec un peu de pseudo-code, il pourrait ressembler à ceci

input = read_next_line(); 
while ((next_command = get_next_command(input)) != NULL) 
{ 
    execute_command(next_command); 
} 

Vous pouvez mettre en œuvre ce avec par exemple strtok ou des fonctions similaires.

+0

je l'ai fait .. je divise l'entrée et la place dans le tableau, et je vérifie que le tableau est correct. Lorsque j'essaie d'exécuter des commandes, je vois "commande non trouvée" – Xri