2016-10-30 4 views
-1
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 

void main(){ 
char *cmd; 
pid_t pid; 
while (1) { 
printf("$ "); 
fgets(cmd,1000,stdin); 
if (pid = fork() == -1) { 
exit(1); 
} 
else if (pid == 0){ 
execvp(cmd,&cmd); 
} 
else{ 
int status; 
wait(&status); 
} 
} 
} 

Je crée un shell simple qui exécute des commandes, mais lorsque j'entre la commande à l'invite, je continue d'obtenir une erreur de segmentation. Ceci est la plus simple version qui ne fonctionne que pour les commandes à un argument comme "ls"Erreur de segmentation à l'aide d'execvp dans le shell c

+0

Bienvenue dans Stack Overflow! Il semble que vous deviez apprendre à utiliser un débogueur pour parcourir votre code. Avec un bon débogueur, vous pouvez exécuter votre programme ligne par ligne et voir où il dévie de ce que vous attendez. C'est un outil essentiel si vous voulez faire de la programmation. Pour en savoir plus: [Comment déboguer de petits programmes] (http://ericlippert.com/2014/03/05/how-to-debug-small-prgrams/). –

+1

Qu'est-ce qui vous a décidé à lire avec un maximum de '1000'' char's? – alk

+1

Ce 'pid = fork() == -1' ne fait pas ce que vous supposez faire (pour plus de détails, voir ici: http://en.cppreference.com/w/c/language/operator_precedence). – alk

Répondre

2

Pour votre problème, dans votre code,

fgets(cmd,1000,stdin); 

cmd est non initialisée. Cela ne pointe pas vers une mémoire valide. L'accès à la mémoire invalide appelle undefined behavior.

Vous devez allouer de la mémoire à cmd avant de pouvoir l'utiliser. Alternativement, vous pouvez envisager de créer un tableau cmd, comme char cmd[1000] = {0}; pour éviter d'avoir à allouer de la mémoire vous-même.

Ensuite, execvp(cmd,&cmd); n'est pas tout à fait raison, ce n'est pas ce que vous pensez. Lisez le man page pour une meilleure compréhension. Cela dit, pour un environnement hébergé, void main() devrait au moins être int main(void) pour avoir la conformité standard.

+0

mais j'ai le 'char * cmd;' qui initie le pointeur si je le vois bien –

+0

@JimmySamoladas, qui définit le 'cmd', ne s'initialise pas il, encore moins être un valide. –

+0

J'ai essayé le tableau char avant mais j'ai des erreurs sur les arguments execvp qui demandent 'const char *' et je donne 'const char * [1000]' –