Классический C. Использование каналов в функции execvp, перенаправлении stdin и stdout

Я хочу смоделировать bash в моей программе на Linux C с использованием каналов и функции execvp. например

ls -l | wc -l  

Есть моя программа:

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);
}

Этот код на самом деле работает, но неделай правильно. Какие'не так с этим кодом? Тот'не работает и я неПонятия не имею, почему.

Ответы на вопрос(2)

Ваш ответ на вопрос