#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define ReadEnd  0
#define WriteEnd 1

void report_and_exit(const char* msg) {
  perror(msg);
  exit(-1);
}

int main() {
  int pipeFDs[2];
  char buf;
  const char* msg = "Nature's first green is gold\n";

  if (pipe(pipeFDs) < 0) report_and_exit("pipeFD");
  pid_t cpid = fork();
  if (cpid < 0) report_and_exit("fork");

  if (0 == cpid) {
    close(pipeFDs[WriteEnd]);

    while (read(pipeFDs[ReadEnd], &buf, 1) > 0)
      write(STDOUT_FILENO, &buf, sizeof(buf));

    close(pipeFDs[ReadEnd]);
    _exit(0);
  }
  else {
    close(pipeFDs[ReadEnd]);

    write(pipeFDs[WriteEnd], msg, strlen(msg));
    close(pipeFDs[WriteEnd]);

    wait(NULL);
    exit(0);
  }
  return 0;
}