title: Writing a simple shell in C using fork/execvp
body: <p>I have to develop a simple shell in C using system calls fork()/execvp(). So far my code takes in a command, splits it up using strtok into an array argv and then I call fork to create a child and execute the command. Im working on this in ubuntu where most of the commands are in the /bin/ directory, so I append the program name (for example /bin/ls) and use that for the first arg of execvp and then I give it the argv array. My program works if I type in the command "ls", but when trying other commands or even "ls -l" I'm getting an "ls: invalid option." Im not sure what I'm doing wrong here. </p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  
  #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&gt;&gt; ");                    //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&lt;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&lt;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");
      }
  
  }
  } 
  </code></pre>