title: How to run a command using pipe?
body: <p>I am trying to run ls|wc using execvp. So I create a pipe and then fork to create a child. I close the appropriate(read./write) end in parent/child and then map the other end to stdout/stdin. Then I run the ls in parent using execvp and wc in child. When I run the program it says </p>
  
  <pre><code> wc:standard input:bad file descriptor.
   0 0 0
   wc: -:Bad file descriptor
  </code></pre>
  
  <p>Here is my code:</p>
  
  <pre><code>int main()
  {
  //int nbBytes = 0; //stream length
  int pfd_1[2]; //file descriptor 
  //char buffer[MAX_FILE_LENGTH]; 
  char* arg[MAX_FILE_LENGTH];
  pid_t processPid;
  
  //Create a pipe
  
  if(pipe(pfd_1) == -1)
  {
      printf("Error in creating pipe");
      return 0;
  }
  
  //Create a child
  processPid = fork();
  
  if(processPid == -1)
  {
      printf("Erro in fork");
      exit(1);
  }   
  else if(processPid == 0) //Child
  {               
      //redirect read end file descriptor to standard input
      dup2(pfd_1[0],0);
      //Close the write end
      if(close(pfd_1[1] == -1))
      {
          printf("Error in closing the write end file descriptor");
          exit(1);
      }
      arg[0] = "wc";
      //arg[1] = "-l";
      arg[1] = '\0';
  
      if(execvp(arg[0],arg) == -1)
      {
          printf("Error in executing ls");
      }       
  
  }
  else //Parent
  {               
      //redirect standard output to the file descriptor
      dup2(pfd_1[1],1);
      //Close the read end
      if(close(pfd_1[0] == -1))
      {
          printf("Error in closing the read end from parent");
          exit(1);
      }
      //Command 
      arg[0] = "ls";
      arg[1] = "/proc/1/status";
      arg[2] = '\0';
  
      if(execvp(arg[0],arg) == -1)
      {
          printf("Error in executing ls");
      }       
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Any idea what might be wrong? Why would it consider standard input as bad file descriptor? My understanding was since the stdin and read end file descriptor are aliases so the wc -l would read whatever the output is from the parent process. Do I need to do scanf to read from the stdin?</p>