2012-04-13 6 views
1

Ich schreibe ein kleines Shell-Programm, das einen Befehl nimmt und ausführt. Wenn der Benutzer einen ungültigen Befehl eingibt, gibt die if-Anweisung eine -1 zurück. Wenn der Befehl korrekt ist, führt er den Befehl aus, aber sobald er den Befehl ausführt, wird das Programm beendet. Was mache ich falsch, dass die Codezeilen danach nicht ausgeführt werden? Ich habe execvp (command.argv [0], command.argv) mit ls und cat-Befehlen getestet, also bin ich mir ziemlich sicher, dass es funktioniert. Hier ist mein Code.Programm stoppt nach execvp (command.argv [0], command.argv)

int shell(char *cmd_str){ 
    int commandLength=0; 
    cmd_t command; 
    commandLength=make_cmd(cmd_str, command); 
    cout<< commandLength<<endl; 
    cout << command.argv[0]<< endl; 
    if(execvp(command.argv[0], command.argv)==-1) 
//if the command it executed nothing runs after this line 
    { 
    commandLength=-1; 

}else 
{ 
    cout<<"work"<<endl; 
} 

    cout<< commandLength<<endl; 
    return commandLength; 


} 
+0

Genau so sollen die 'exec *' Funktionen funktionieren! Sie laden das neue Programm und _replace_ dein Programm mit dem neuen. –

+3

@Aaron: Sie würden erwarten, dass Flugzeugpiloten mindestens ** das Handbuch ** des Flugzeugs lesen, an dem sie "arbeiten" wollen. Warum haben Sie nicht die gleichen Erwartungen an Sie als Programmierer? – ereOn

Antwort

6

Von man page von execvp(3)

Die exec() -Familie von Funktionen mit das aktuelle Prozessabbild ersetzt ein neues Prozessabbild

So Ihre aktuelle Prozessabbild mit dem überschrieben Bild von deinem Befehl! Daher müssen Sie immer eine fork+exec Kombination verwenden, damit Ihr Befehl im Child-Prozess ausgeführt wird und Ihr aktueller Prozess als Elternprozess sicher fortgesetzt wird!

Auf eine leichtere Note möchte ich das Problem mit einem Bild als ein Bild spricht tausend Worte. Nichts für ungut :) :)

enter image description here

0

Aus der Dokumentation auf exec

Die exec() -Familie von Funktionen ersetzt das aktuelle Prozessabbild mit einem neuen Prozessabbild. Die in dieser Handbuchseite beschriebenen Funktionen sind Frontends für Execve (2). (Siehe Handbuch Seite> execve (2) für weitere Informationen über das Ersetzen des aktuellen Prozessabbild.)

Wenn Sie Ihren Prozess fortsetzen möchten, ist dies nicht die Funktion, die Sie verwenden möchten.

0

@Pavan - Nur für Nitpicker wie mich, technisch ist die Aussage "aktueller Prozess ist weg" nicht wahr. Es ist immer noch der gleiche Prozess, mit der gleichen PID, nur mit einem anderen Bild überschrieben (Code, Daten usw.).

+0

Dies sollte wahrscheinlich als Kommentar zu @ Pavans Frage gemacht werden oder eine vollständige und korrekte Antwort geben. – crashmstr

+0

Englisch ist eine Phunny-Sprache, die Sie kennen :) Ich habe meine Antwort umformuliert. –

+0

@crashmstr: Ich denke, dass dieser Typ unterhalb der Kommentarschwelle ist. – Puppy