Verknüpfung mehrerer Pipes



  • Hi,

    ich möchte gerne 3 Prozesse miteinander über zwei Pipes kommunizieren lassen, d.h. sowas wie "prog1 | prog2 | prog 3". Mit zwei Prozessen funktioniert es (prog1 | prog2), aber mit 3 eben nicht.

    if ((n = pipe(fd1)) < 0)
                      printf("pipe nicht erzeugt\n");
                   else {
    
                      if ((pid1 = fork()) < 0)
                         printf("Kindprozess nicht erzeugt\n");
                      else if (pid1 == 0) { // Kindprozess #1
    
                         close(fd1[0]); 
                         close(1); 
                         dup(fd1[1]);   
                         close(fd1[1]); 
    
                         execve(*prog[0], *prog, environ);
    
                      } else {
                         if ((pid2 = fork()) < 0) {
                            printf(stderr, "Kindprozess 2 nicht erzeugt\n");
                         } else if (pid2 == 0) { // Kindprozess #2
    
                            close(0);
                            dup(fd1[0]);
                            close(fd1[0]);
    
                            if (ncmds > 2) { // Falls prog1 | prog2 | prog3
                               close(1);
                               dup(fd1[1]);
                               close(fd1[1]);
                            }
    
                            execve(*prog[1], *prog, environ);
    
                         } else { // Elternprozess
    
                            if (ncmds == 3) { // Falls prog1 | prog2 | prog3
    
                               if ((n = pipe(fd2)) < 0)
                                  printf("Pipe 2 nicht erzeugt\n");
                               else {
                                  if ((pid3 = fork()) < 0)
                                     printf("Kindprozess 3 nicht erzeugt\n");
                                  else if (pid3 == 0) { // Kindprozess #3
    
                                     close(fd2[1]);
                                     close(0);
                                     dup(fd2[0]);
                                     close(fd2[0]);
    
                                     execve(*prog[2], *prog, environ);
    
                                  } else { // Elternprozess 
    
                                     close(fd1[0]);
                                     close(fd1[1]);  
                                     close(fd2[0]);
                                     close(fd2[1]);
                                  }
                               }
                            }
                         }
                      }
                   }
    

    Ich verstehe auch nicht genau, wie durch das Schliessen der Standardeingabe sowie dem Schliessen des File-Deskriptors eine "Umleitung" in die Pipe erzeugt wird.



  • Hat sich erledigt, habe es selbst hinbekommen. Danke.


Anmelden zum Antworten