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 unsichere while(token!=NULL) machen es while(token!=NULL && i < 100)
InformationsquelleAutor C1116 | 2015-02-13
Schreibe einen Kommentar