title: How do I use two pipes in Unix C?
body: <p>I have a homework to do that says the following: </p>
  
  <p>Write a program in C that creates a child who will also create a child, make a pipe between the three processes, the fist process(father) will connect the second(child) and the child will connect with the third (child of the child). Our program should display the total number of system users who use bash as default shell. The result of the program should be identical to the "cat / etc / passwd | grep" / bin / bash $ "| wc-l"</p>
  
  <p>I am confused with the first child and the method that we close the first pipe and open the second in the same time. If you reply me with the right code I 'll undestand it right once.</p>
  
  <p>Thank you.</p>
  
  <p>Here is what I 've wrote so far:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;unistd.h&gt;
  main()
  {
  int pid, pid2;
  int fd[2];
  int fd2[2];
  char *arg[3];
  char *arg2[3];
  char *arg3[3];  
  if (pipe(fd) == -1)
  {
      perror("pipe");
      exit(1);
  }
  pid = fork();
  if (pid == -1)
  {
      perror("fork");
      exit(2);
  }
  if (pid == 0)
  {
      if (pipe(fd2) == -1)
      {
          perror("pipe");
          exit(11);
      }
      pid2=fork();
      if(pid2 == -1)
      {
          perror("fork 2");
          exit(22);
      }
      if (pid2 == 0)
      {
          //i am child 2 (child of the child)
          close (fd2[1]);
          dup2 (fd2[0],0);
          close (fd2[0]);
          arg3[0] = "wc";
          arg3[1] = "-l";
          arg3[2] = NULL;
          execvp("wc", arg3);
          perror("execvp second child");
      }
      else
      {
          //i am child 1
          close (fd[1]);
          dup2(fd[0],0);
          close (fd[0]);
          close (fd2[0]);
          dup2(fd2[1],1);
          close (fd2[1]);
          arg2[0] = "grep";
          arg2[1] = "/bin/bash$";
          arg2[2] = NULL;
          execvp("grep", arg2);
          perror("execvp first child");
      }
  }
  else
  {
      //i 'm the father
      close (fd[0]);
      dup2(fd[1],1);
      close (fd[1]);
      arg[0] = "cat";
      arg[1] = "/etc/passwd";
      arg[2] = NULL;
      execvp("cat", arg);
      perror("execvp father");    
  }   
  </code></pre>
  
  <p>}</p>