2016-10-30 11 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); 
} 
} 
} 

Ich mache eine einfache Shell, die Befehle ausführt, aber wenn ich den Befehl an der Eingabeaufforderung eingeben, bekomme ich Segmentierung Fehler. Dies ist die einfachste Version, die nur für ein Argument Befehle wie "ls"Segmentierungsfehler mit execvp in c-Shell

+0

Willkommen bei Stack Overflow! Es klingt, als müssten Sie lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-prigrams/). –

+1

Was hat dich dazu gebracht, maximal 1000 'char's einzulesen? – alk

+1

Das 'pid = fork() == -1' tut nicht das, was Sie annehmen (Details siehe hier: http://en.cppreference.com/w/c/language/operator_precedence). – alk

Antwort

2

Für Ihr Problem, in Ihrem Code arbeitet,

fgets(cmd,1000,stdin); 

cmd nicht initialisiert ist. Es zeigt nicht auf einen gültigen Speicher. Zugriff auf ungültigen Speicher ruft undefined behavior auf.

Sie müssen cmd Speicher reservieren, bevor Sie das verwenden können. Alternativ können Sie auch ein cmd Array wie char cmd[1000] = {0}; erstellen, um zu vermeiden, dass Sie selbst Speicher reservieren müssen.

Dann ist execvp(cmd,&cmd); nicht ganz richtig, es ist nicht, was Sie denken, dass es ist. Lesen Sie die man page für ein besseres Verständnis.

Für eine gehostete Umgebung sollte void main() mindestens int main(void) sein, um Standardkonformität zu haben.

+0

, aber ich habe die 'char * cmd;', die den Zeiger initiiert, wenn ich dieses Recht sehe –

+0

@JimmySamoladas gut, das definiert die 'cmd', nicht initialisiert es, geschweige denn ein _valid_ one. –

+0

Ich habe versucht, die Char-Array vor, aber ich bekomme Fehler über die Execvp Argumente, die fragt nach const char * 'und ich geben' const char * [1000] ' –