Programación concurrente en Linux

    // pipes.c
    // Prueba de pipes (fifos sin nombre).
    /////////////////////////////////////////////////////////////////

    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>

    #define error(a) {perror(a); exit(-1);}

    main(int argc, char *argv[])
    {
       int pfd[2];
       int id;

       if(pipe(pfd) == -1) error("pipe");
       switch(fork()) {
          case -1:  error("fork");
          case 0:
             if (close(1) == -1) error("close");
             if (dup(pfd[1]) != 1) error("dup");
             if (close(pfd[0])==-1 || close(pfd[1])==-1) error("close");
             execlp("./sim_CO2", "./sim_CO2", NULL);
             error("execlp");
       }

       switch(fork()) {
          case -1:  error("fork");
          case 0:
             if (close(0) == -1) error("close");
             if (dup(pfd[0]) != 0) error("dup");
             if (close(pfd[0])==-1 || close(pfd[1])==-1) error("close");
             execlp("cat", "cat", NULL);
             error("execlp");
            }

       if (close(pfd[0])==-1 || close(pfd[1])==-1) error("close");

       while ((id=wait(NULL)) != -1) ;
       unlink("mififo") ;
    }