2016-04-13 5 views
0

Ich schreibe ein Programm, das den Wortzählbefehl für den untergeordneten Prozess ausführt. Der Vaterprozess sollte eine Sequenz von Zeilen, die vom Benutzer durch eine Pipeline eingegeben wurden, an den Kindprozess senden. Ich habe versucht, dies zu tun, aber ich endete mit einem Fehler. Dies ist mein Code:Ausführen von WC-Befehl auf untergeordneten Prozess mit Pipeline

int main() 
{ 
    int fd[2]; 
    char buff; 
    int pid; 
    int pip; 
    pid = fork(); 
    pip = pipe(fd); 

    if (pid != 0) 
    { 
     pip = pipe(fd); 
     if (pipe == 0) 
     { 
      while (read(fd[0], &buff,1) > 0) 
      { 
       write (fd[1],&buff,1);  
      } 
      close(fd[0]); 
      _exit(0); 
     } 
    } 
    else 
    { 
     dup2(fd[1],1); 
     close(fd[1]); 
     execlp ("wc","wc",NULL); 
     _exit(-1); 
    } 
    return 0; 
} 

ich auch dup2 zu verwenden, habe versucht, die Standardeingabe von dem Kind auf die Lese Beschreiber des Rohres durch den Vater Prozess erstellt zu verknüpfen. Aber ich bekomme diesen Fehler: wc: standard input: Input/output error. Wie kann ich das lösen?

AKTUALISIERT (der Fehler behoben ist, aber ich erhalte eine Endlosschleife)

int main() 
{ 
    int fd[2]; 
    char buff; 
    int pid; 
    int pip; 

    pip = pipe(fd); 

    if (pip == 0) 
    { 
      pid = fork(); 
     if (pid != 0) 
      {  

      while (read(fd[0], &buff,1) > 0) 
      { 
       write (fd[1],&buff,1);  
      } 
      close(fd[0]); 

      } 
      else { 

     dup2(fd[1],1); 
     close(fd[1]); 
     execlp ("wc","wc",NULL); 
     _exit(-1); 
      } 
    } 
    return 0; 
} 
+2

Warum sind Sie fordern Rohr() zweimal auf dem gleichen fd Array? Warum forkst du zuerst und dann die Pfeife? Das Erstellen der Pipe in einem Thread und ihre Verwendung in dem anderen Thread ist für Racebedingungen offen. –

+0

@WernerHenze Du hast Recht, die Pfeife sollte vom Vaterprozess erstellt werden. Mein Fehler. –

+1

@WernerHenze, es ist schlimmer als du sagst, weil es hier keine Threads gibt und daher keine geteilten Daten. Der Child-Prozess sieht * niemals * den Effekt des zweiten 'pipe()' -Aufrufs in seiner Kopie des Arrays, und durch diesen Aufruf verliert der Elternteil die FDs der Pipe an das Kind. –

Antwort

0
#include <unistd.h> 

int main() 
{ 
    int fd[2]; 
    char buff; 
    int pid; 
    int pip; 
    int status; 

    pip = pipe(fd); 

    if (pip == 0) 
    { 
     pid = fork(); 
     if (pid != 0) 
     { 
      close(fd[0]); 
      while (read(0, &buff,1) > 0) 
      { 
       write (fd[1],&buff,1); /* your old loop forwarded internally in the pipe only*/ 
      } 
      close(fd[1]); 
     } else { 
      dup2(fd[0],0); /* you had dup2(fd[1], 1), replacing stdout of wc with the write end from wc */ 
      close(fd[0]); 
      close(fd[1]); 
      execlp ("wc","wc",NULL); 
      _exit(-1); 
      } 
    } 
    wait(&status); /* reap the child process */ 
    return 0; 
} 
Verwandte Themen