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;
}
}
Merci beaucoup! J'ai juste essayé de déclarer l'entrée comme statique et maintenant cela fonctionne. – sworwitz
Pensez-vous que c'est la bonne solution ou devrais-je essayer quelque chose d'autre? – sworwitz
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. –