title: C pipe, fork, dup, and exec()
body: <p>I'm trying to pass list of strings through pipe to child process where it should display through <code>/bin/cat</code> using <code>execl()</code>.  I had it working earlier except that the pipe did not close so the program kept waiting. Don't know what I did and now it is not working at all. Can someone see my code and tell me what am I doing wrong that the <code>str</code> data is not being displayed by cat in child process?</p>
  
  <pre><code>int main(int argc, char** argv) {
  
      char *str[] = {"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"};
      int fds[TOTAL_CHILDREN];
      int writeFds;
      int catPID;
      int status;
  
      FILE * write_to_child;
  
      //create pipe
      if (pipe(fds) == -1) {
          perror("creating pipe: failed");
          exit(EXIT_FAILURE);
      }
      pipe(fds);
      //create subprocess for cat child
  
      switch (catPID) {
          case 0: // successful creation of child
              close(fds[1]); //close write side from parents
              close(0); //close stdin
              dup(fds[0]); //connect pipe from execl cat to stdin
  
              execl("/bin/cat", "cat", (char *) 0);
              perror("exec failed!");
              exit(20);
              break;
  
          case -1: //failure
              perror("fork failed: cat process");
              exit(EXIT_FAILURE);
  
          default: //parent process
              close(fds[0]);
  
              writeFds = fds[1];
              write_to_child = fdopen(fds[1], "w");
  
              if (write_to_child == NULL) {
                  perror("write to pipe failed");
                  exit(EXIT_FAILURE);
              }
              break;
  
  
      }
  
      int i;
      for (i = 0; i &lt; 9; i++){
          fprintf(write_to_child, "%s\n", str[i]);
      }
  
      fclose(write_to_child);
      close(writeFds);
  
      wait(&amp;status);
  
      return (EXIT_SUCCESS);
  }
  </code></pre>