Newsgroup: it.comp.lang.c
Titolo: problema 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 le varie close mi dicono : bad
file descriptor. Spero con tutto il cuore che qualcuno possa risolvere
il problema. Grazie.

Non c'è nessuno che può aiutarmi ?

 Non c'č nessuno che puň aiutarmi ?
Trattandosi di un problema che riguarda la programmazione in ambiente Unix e
non il linguaggio C (il cui standard non contempla funzioni come 'pipe',
'waitpid' o 'execl'), questo non č il newsgroup piů adatto. Avrai
certamente piů fortuna sul newsgroup dedicato alla programmazione in
ambiente Linux: it.comp.os.linux.development.
Max

 Max
grazie

 Max
grazie

 Max
grazie

Potevi almeno dirgli grazie ...

test