title: C++ pipe and fork
body: <p>I'm working on a sample program to learn how pipes and forking works. In my very basic implementation, in my child process, i closed 0 and duplicated the read end of the pipe so that file descriptor 0 is now the read end of my pipe.</p>
  
  <p>From my parent process, I write out a string, and in my child process, I read the string using cin as cin essentially is my read end of the pipe and what I observe is the complete string does not print out and I can't seem to understand why!</p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;unistd.h&gt;
  #include &lt;sys/types.h&gt;
  #include &lt;sys/wait.h&gt;
  
  #define TEST_STRING "Hello, Pipe!"
  int main(int argc, char const *argv[]) {
    int fd[2];
    pipe(fd);
  
    pid_t pid;
    if ((pid = fork()) == 0) {
      //Child
      close(0);
      close(fd[1]);
      int myCin = dup(fd[0]);
      char buf[sizeof(TEST_STRING)];
  
      // int x;
      // std::cin &gt;&gt; x;
      // std::cout &lt;&lt; x &lt;&lt; std::endl;
      // read(myCin, buf, sizeof(TEST_STRING));
      std::cin &gt;&gt; buf;
  
      std::cout &lt;&lt; buf &lt;&lt; std::endl;
  
    }
    else {
      //parent
      write(fd[1], TEST_STRING, sizeof(TEST_STRING));
      close(fd[1]);
      waitpid(pid, NULL, 0);
    }
    return 0;
  }
  </code></pre>
  
  <p>Here's my strace as well:</p>
  
  <pre><code>clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd895adaa10) = 1904
  strace: Process 1904 attached
  [pid  1903] write(4, "Hello, Pipe!\0", 13) = 13
  [pid  1903] close(4)                    = 0
  [pid  1903] wait4(1904,  &lt;unfinished ...&gt;
  [pid  1904] close(0)                    = 0
  [pid  1904] close(4)                    = 0
  [pid  1904] dup(3)                      = 0
  [pid  1904] fstat(0, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
  [pid  1904] read(0, "Hello, Pipe!\0", 4096) = 13
  [pid  1904] fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
  [pid  1904] write(1, "Hello,\n", 7)     = 7
  [pid  1904] read(0, "", 4096)           = 0
  [pid  1904] exit_group(0)               = ?
  [pid  1904] +++ exited with 0 +++
  </code></pre>