Allora deve funzionare coma la shell di linux. Se io eseguo questo comando:

ls -l | grep [a-c]*.c

L'output di ls -l deve andare in input a grep che poi produrra il suo output. Quindi ogni comando deve ricevere l'input dal precedente e inviare l'output al successivo. Come compilatore io uso gcc. Adesso posto un pezzo del codice.

codice:
#include "functions.h"

void pipecmds(char **commands, int cmds){
   FILE *fpipe[cmds];
   int fd;
   int i,status;
   pid_t pid;
   if((pid=fork()) < 0){
      perror("fork error");
      exit(FORK_ERR);
   }
   if(pid == 0){
      for(i=0; i<cmds; --i){
         fpipe[i]=popen(commands[i],"w");
         dup2(fileno(fpipe[i]), STDOUT_FILENO);
      }
      for(i=cmds; i>0; --i)
         pclose(fpipe[i]);
   }
   if(pid > 0){
      if (waitpid(pid,&status,0) == -1){
         if(errno!=EINTR){
            perror("waitpid error");
            exit(WAIT_ERR);
         }
         else{
            kill(pid,SIGTERM);
               do{
                  if (waitpid(pid,&status,0) != -1)
                  break;
               }while(errno==EINTR);
         }
      }
   }
   return;
}