Ciao.

Ho un problema con questo ciclo che praticamente dovrebbe eseguire dei comandi in pipe (proprio come fa la shell di Linux). Posto il codice:

codice:
for(i=1; i<res; ++i){
      if((pid = fork()) < 0){
         perror("fork error");
         exit(FORK_ERR);
      }
      if(pid == 0){  
         if(args!=NULL){
            free(args);
            args=NULL;
         } 
         args=(char **)calloc(MAX_ARGS,sizeof(char *));
         if(do_I_launch_parse(commands[i]) == 1)
            parse(commands[i],args);
         if(i==res-1){
            close(p[1]);
            if(dup2(p[0],STDIN_FILENO) == -1){
               perror("dup error");
               exit(DUP_ERR);
            }       
            close(p[0]);
         }
         else{
            if(dup2(p[0],STDIN_FILENO) == -1){
               perror("dup error");
               exit(DUP_ERR);
            }       
            if(dup2(p[1],STDOUT_FILENO) == -1){
               perror("dup error");
               exit(DUP_ERR);
            }       
            close(p[0]);
            close(p[1]);
         }
         ((args[0]==NULL) ? execlp(commands[i],commands[i],NULL) : execvp(commands[i],args));
         perror("exec failed");
         exit(EXEC_ERR); 
      }
      if(pid > 0){
         if (waitpid(pid,&status,WNOHANG) == -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);
            }
         }
         sleep(1);
      }
}
Come potete vedere ho dovuto mettere WNOHANG nell'ultima waitpid() e fare una sleep(1) perché se non metto WNOHANG il padre aspetta indefinitamente che il figlio termini. Però non è una bella cosa scrivere il codice così, quindi lo dovrei modificare. La cosa strana è che il figlio fa tutto bene e mi dà anche l'output, solo che non termina e non capisco perché. Chi mi può dare una mano?

Grazie .