title: making shell in C
body: <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;sys/types.h&gt;
  #include &lt;string.h&gt;
  #include &lt;sys/stat.h&gt;
  #include &lt;fcntl.h&gt;
  
  void exec(char **args){
      pid_t  pid;
      int status;
      if ((pid = fork()) &lt; 0) {    
          printf("*** ERROR: forking child process failed\n");
          exit(1);
      }
      else if (pid == 0) {      
          if(execvp(args[0],args)&lt;0)//{
              //printf("argv[0]=%s argv[1]=%s",args[0],args[1]);
              printf("**error in exec\n");
      }
      else {                                  
          while (wait(&amp;status) != pid);
      }
  }
  
  void exec2(char **args, char *file){
      printf("file =%s\n",file);
      int fd;
      pid_t pid;
      int status;
      if ((pid = fork()) &lt; 0) {    
          printf("*** ERROR: forking child process failed\n");
          exit(1);
      }
  
      else if (pid == 0) {   
          fd = open(file, O_RDWR | O_CREAT, (mode_t)0600);
          close(1);
          dup2(fd, 1);
          if(execvp(args[0],args)&lt;0){
              printf("**error in exec");
          }
  
          else {  
              printf("\nhere\n");
              close(fd);                                
              while (wait(&amp;status) != pid){
                  fflush(stdout) ;
              }
      }
  }
      close (fd);
  }
  
  
  void main(){
      char *command;
      char inp[512];
      char *filepath;
      size_t size=0;
      char *substr;
      char *args[512];
      command = (char *) malloc(sizeof(char *) * 512);
      int flag=0;
      int redirect=0;
      int i=0;
      while (1){
          printf("$ ");
          command = fgets(inp, 512/*sizeof(char *)*/, stdin);
  
          command[strlen(command)-1]='\0';
  
          if (strchr(command,'&gt;')){
              redirect=1;
              strtok_r(command,"&gt;",&amp;filepath);
          }
  
          size_t siz=4;
          //printf("command=%s\n",command);
          int i=0;
          while(1){
              //printf("i=%d\n",i);
              char *tok = strtok_r(command," ",&amp;substr);
              if (tok==NULL){
                  break;
              }
              args[i++] = tok;
  /*              printf("tok=%s\n",tok);
              printf("len tok = %d\n",(int)strlen(tok));
              printf("command=%s\n",command);
              printf("substr=%s\n",substr);     
  */           command = substr;
      }
  
      //printf("args[0]=%s",args[0]);
      if (!strncasecmp(args[0],"exit",siz) || !strncasecmp(args[0],"quit",siz))
      {
          printf("\nBye\n");
          exit(0);
      }
  
      else if(strcmp(args[0],"cd")==0){
          chdir(args[1]);
          //printf("chdir")   ;
          //system("pwd");
  } 
  
  else if (redirect==1){
      exec2(args,filepath);
  }
  
  else exec(args);
  }
  }
  </code></pre>
  
  <p>Okay this is my code for my shell. When i run it, i put <code>ls</code> and it gives correct output. Then i put <code>ls -l</code> and then ls again and it gives:</p>
  
  <p><code>ls: cannot access : No such file or directory</code> </p>
  
  <p>Also when I use <code>cd</code>, <code>ls</code> doesnt give output and <code>pwd</code> says:</p>
  
  <p><code>"ignoring unused arguments"</code> </p>
  
  <p>Also <code>cat</code> doesnt work. Though <code>mkdir</code>, <code>ps</code> and <code>ls -l</code> works.</p>