Schreiben Sie eine einfache shell in C mit Gabel/execvp
Habe ich die Entwicklung eines einfachen shell in C unter Verwendung von system calls fork()/execvp(). So weit mein code nimmt, in einen Befehl, teilt es mit strtok in ein array argv gespeichert und dann rufe ich die Gabel zu schaffen, ein Kind und den Befehl ausführen. Im arbeiten auf diese in ubuntu, wo die meisten der Befehle sind in den /bin/- Verzeichnis, so dass ich fügen Sie den Programm-Namen (z.B. /bin/ls) und verwenden, die zum ersten arg execvp und dann gebe ich es den argv-array. Mein Programm funktioniert wenn ich geben Sie den Befehl "ls", aber wenn Sie versuchen, andere Befehle oder auch "ls -l" ich bin immer ein "ls: ungültige option". Im nicht sicher, was ich falsch mache hier.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_LEN 1024
int main(){
char line[BUFFER_LEN]; //get command line
char* argv[100]; //user command
char* path= "/bin/"; //set path at bin
char progpath[20]; //full file path
int argc; //arg count
while(1){
printf("My shell>> "); //print shell prompt
if(!fgets(line, BUFFER_LEN, stdin)){ //get command and put it in line
break; //if user hits CTRL+D break
}
if(strcmp(line, "exit\n")==0){ //check if command is exit
break;
}
char *token; //split command into separate strings
token = strtok(line," ");
int i=0;
while(token!=NULL){
argv[i]=token;
token = strtok(NULL," ");
i++;
}
argv[i]=NULL; //set last value to NULL for execvp
argc=i; //get arg count
for(i=0; i<argc; i++){
printf("%s\n", argv[i]); //print command/args
}
strcpy(progpath, path); //copy /bin/to file path
strcat(progpath, argv[0]); //add program to path
for(i=0; i<strlen(progpath); i++){ //delete newline
if(progpath[i]=='\n'){
progpath[i]='\0';
}
}
int pid= fork(); //fork child
if(pid==0){ //Child
execvp(progpath,argv);
fprintf(stderr, "Child process could not do execvp\n");
}else{ //Parent
wait(NULL);
printf("Child exited\n");
}
}
}
- Sie brauchen nicht Anhängen
/bin
auf den Dateinamen, es sei denn, die Umgebungsvariable PATH enthält nicht/bin
. Auch dies ist unsicher, wahrscheinlich ist es nicht in Bezug auf das problem, aber unsicherewhile(token!=NULL)
machen eswhile(token!=NULL && i < 100)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der ungültigen option ist, weil
fgets()
hält die'\n'
wenn Sie die EINGABETASTE drücken, versuchen Sie, diesewenn Sie versuchen, um call
ls -l
Sie auf der Durchreise sind"-l\n"
als option, daher die Meldung.Müssen Sie ändern
zu
gets()
zum speichern von standard-Eingabe sehen, warum, ich versuche, es zu ersetzen mitfgets()
, andere Methoden, aber im Falle vonls
Befehl habe ich die gleichen Fehler.ls: cannot access '': No such file or directory