pipe.c
author Markus Bröker <mbroeker@largo.dyndns.tv>
Mon, 21 Jun 2010 01:09:18 +0200
changeset 135 f837cf975e95
parent 113 397270b5d21a
child 140 05d42a3737a4
permissions -rw-r--r--
DBClient: update, query and metadata committer: Markus Bröker <mbroeker@largo.homelinux.org>

/**
 * pipe.c
 * Copyright (C) 2009 Markus Broeker
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/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;
}