2016-10-14 2 views
1

J'essaie de créer un programme shell simple qui exécute le programme spécifié en entrée. Il y a deux fonctions principales: scanner() (utiliser strtok pour diviser l'entrée en jeton) et execute() (fork le processus et exécuter le programme). Malheureusement, cela ne fonctionne pas ... J'ai essayé d'imprimer string[0] à la fin de scanner() et au début de execute(). La première fois que la sortie est correcte, mais la deuxième fois string[] semble être modifié dans une séquence de nombres aléatoires si execvp() ne fonctionne pas ...Bogue de chaîne dans le programme my_shell

Je ne peux pas comprendre pourquoi les valeurs de string[] changements, probablement est une erreur très stupide mais je ne peux pas le voir. J'ai vraiment besoin de ton aide! Merci pour les conseils.

#include <unistd.h> 
#include <stdio.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/wait.h> 

#define DIM 256 

int scanner(char*[]); 
int execute(char*[]); 

int main() 
{ 
    char* string[DIM]; 

    scanner(string); 
    execute(string); 

} 

/* scan: read the input in token*/ 
int scanner(char* string[]) 
{ 
    char input[1024]; 
    char delimit[]=" \t\r\n\v\f"; 
    int i = 0; 

    if(fgets(input, sizeof input, stdin)) { 
     string[i] = strtok(input, delimit); 
     while(string[i]!=NULL){ 
      i++; 
      string[i]=strtok(NULL,delimit); 
     } 
     return 0; 
    } 
    return 1; 
} 
/* execute: execute the command*/ 
int execute(char* string[]) 
{ 
    int pid; 
    printf("%s\n", string[0]); 
    switch(pid = fork()){ 
     case -1: 
      return 1; 
     case 0: 
      execvp(string[0], string); 
      return 1; 
     default: 
      wait((int*)0); 
      return 0; 
    } 
} 

Répondre

3

La variable chaîne input dans scanner est une variable locale, avec la classe de stockage "auto". Cela signifie que lorsque cette fonction revient, cette variable disparaît et la mémoire qu'elle occupe peut être réutilisée pour d'autres choses. C'est regrettable, puisque strtok renvoie les pointeurs en cette variable de chaîne.

+0

Merci beaucoup! J'ai juste essayé de déclarer l'entrée comme statique et maintenant cela fonctionne. – sworwitz

+0

Pensez-vous que c'est la bonne solution ou devrais-je essayer quelque chose d'autre? – sworwitz

+0

La déclaration du fonctionnement statique, mais vous pouvez également envoyer la variable de chaîne en entrée de main, comme vous le faites avec le tableau. –

1

J'ai vu que la réponse précédente a résolu votre problème. J'ajouterai que la page man Linux pour les fonctions execv(), execvp() et execvpe() spécifie que le tableau de pointeurs doit être terminé par un NULL pointer.

+0

Cela aurait du être un commentaire –

+0

Je n'ai pas encore le privilège – fuentesj

+0

Si vous n'avez pas encore le privilège, vous n'avez simplement pas de commentaire. les commentaires postés comme réponses ont tendance à attirer les votes négatifs, ce qui rend plus difficile l'obtention du privilège «commenter partout» _ pour commencer. Il y a quelque chose à ce sujet dans la section d'aide –