title: Classic C. Using pipes in execvp function, stdin and stdout redirection
body: <p>I want to simulate bash in my Linux C program using pipes and execvp function. e.g</p>
  
  <pre><code>ls -l | wc -l  
  </code></pre>
  
  <p>There is my program:</p>
  
  <pre><code>if(pipe(des_p) == -1) {perror("Failed to create pipe");}
  
  if(fork() == 0) {    //first fork
    close(1);          //closing stdout
    dup(des_p[1]);     //replacing stdout with pipe write 
    close(des_p[0]);   //closing pipe read
    close(des_p[1]);   //closing pipe write
  
    if(execvp(bash_args[0], bash_args)) // contains ls -l
      /* error checking */
  }
  else {
    if(fork() == 0) {  //creating 2nd child
      close(0);        //closing stdin
      dup(des_p[0]);   //replacing stdin with pipe read
      close(des_p[1]); //closing pipe write
      close(des_p[0]); //closing pipe read
  
      if(execvp(bash_args[another_place], bash_args)) //contains wc -l
        /* error checking */
    }
  
    close(des_p[0]);
    close(des_p[1]);
    wait(0);
    wait(0);
  }
  </code></pre>
  
  <p>This code actually runs, but doesn't do the right thing.
  What's wrong with this code? That's not working and I don't have a clue why.</p>