new file mode 100644
--- /dev/null
+++ b/pipe.c
@@ -0,0 +1,69 @@
+/**
+ * pipe.c
+ * Copyright (C) 2009 Markus Broeker
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <wait.h>
+#include <assert.h>
+
+#define MAX 50
+
+int main (int argc, char **argv)
+{
+ int tube[2];
+ int i, status, count = 0;
+
+ pid_t pid;
+
+ char buffer[80];
+
+ for (i = 0; i < MAX; i++) {
+ if (pipe (tube) == -1) {
+ perror ("PIPE");
+
+ return EXIT_FAILURE;
+ }
+
+ pid = fork ();
+ switch (pid) {
+ case 0:
+ // we only want to write
+ close (tube[0]);
+
+ /**
+ * copy on write: every forked process gets its own copy of i
+ * and the magic of synchronization works
+ */
+ for (i = 0; i < MAX; i++)
+ status = write (tube[1], "MESSAGE FROM SON\n", 17);
+ break;
+
+ case -1:
+ printf ("ERROR");
+ break;
+
+ default:
+ printf ("Son started as pid %d\n", pid);
+
+ // we only want to read...
+ close (tube[1]);
+
+ FILE *f = fdopen (tube[0], "r");
+ assert (f != NULL);
+ while (fgets (buffer, sizeof (buffer), f) != NULL) {
+ printf ("FATHER RECEIVED [%4d]: %s", count++, buffer);
+ }
+
+ if (fclose (f) < 0)
+ perror ("fclose");
+
+ printf ("PID [%4d] has finished...\n", wait (&pid));
+ }
+ }
+
+ return EXIT_SUCCESS;
+}