Newsgroup: it.comp.os.linux.development
Titolo: problemi con pipe

Sto impazzendo su questo programma che esegue una pipe su n comandi da
riga da comando senza opzioni.
Il codice è il seguente:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>
#define READ 0
#define WRITE 1
int main(int argc,char** argv)
{
  assert(argc>2);
  int fd[2],i;
  int last=0;
  pid_t pid;
  for(i=1;i<argc;i++)
    {
      fd[READ]=last;               //Memorizzo il fd della pipe in
lettura dell'ultimo comando eseguito
      if(i!=(argc-1))              //Se ci sono almeno due comandi da
eseguire
        {
          if((pipe(fd))==-1)         //Creo la pipe
            {
              perror("pipe:");
              exit(-1);
            }
          last=fd[READ];
        }
      if((pid=fork())==-1)                  //Eseguo la fork
        {
          perror("fork:");                  //Errore nella fork
          exit(-1);
        }
      if(pid==0)                             //Il figlio esegue il
comando
        {
          if(fd[WRITE]!=STDOUT_FILENO)             //Se non è
associato allo
stdout
            {
              if(close(fd[READ]))                   //Chiudo la pipe in
lettura in quanto scrivo sullo stdout
                {
                  perror("close1:");
                  exit(-1);
                }
              if(dup2(fd[WRITE],STDOUT_FILENO)==-1)        //Duplico il
fd
                {
                  perror("dup2-out:");
                  exit(-1);
                }
              if(close(fd[WRITE]))                  //La pipe ora è
associata
allo stdout
                {
                  perror("close2:");
                  exit(-1);
                }
            }
          if(fd[READ]!=STDIN_FILENO)               //Se non è
associato allo
stdin
            {
              if(close(fd[WRITE]))                //Chiudo la pipe in
scrittura in quanto leggo dallo stdin
                {
                  perror("close3:");
                  exit(-1);
                }
              if(dup2(fd[READ],STDIN_FILENO)==-1)  //Duplico il fd
                {
                  perror("dup2-in:");
                  exit(-1);
                }
              if(close(fd[READ]))                 //La pipe ora è
associata
allo stdin
                {
                  perror("close4:");
                  exit(-1);
                }
           }
          if(execlp(argv[i],argv[i],NULL)==-1)     //Eseguo il comando
con la
corretta redirezione del fd
            {
              perror("execlp:");
              exit(-1);
            }
        }
      else
        {
          if(waitpid(pid,NULL,0)==-1)         //Attendo la terminazione
del
figlio
            {
              perror("waitpid:");
              exit(-1);
            }
          if(close(fd[READ]))                    //Chiudo la pipe in
lettura
            {
              perror("close5:");
              exit(-1);
            }
          if(close(WRITE))                     //Chiudo la pipe in
scrittura
            {
              perror("close6:");
              exit(-1);
            }
        }
    }
  return 0;
}
Ho provato in tutti i modi ma non riesco a capire dove stà l'errore.
Il programma compila correttamente ma la dup2 non capisco com'è ma non
viene eseguita e di conseguenza le close mi danno : bad file
descriptor.
Spero con tutto il cuore che qualcuno possa risolvere il problema.
Grazie.

cè nessuno che possa aiutarmi ?

 cè nessuno che possa aiutarmi ?
No, finche` sarai cosi` scostumato.
Se e` urgente metti urgente e non postare ogni
mezz'ora lo stesso messaggio.

 le close mi danno : bad file descriptor.
Occhio alla grammatica ed ala sintassi 
[cioe` scrivi in italiano NdT]

 
se immagino bene (:P), si tratta di un esercizio per l'università 
(laboratorio di sistemi operativi I).
"implementare una mini-shell in c" (sulla base della shell di thompson)
ho indovinato? :P
Un saluto!
Gabriele.