2016-03-24 8 views
0

Ich habe an der Erstellung einer Pipe in c zwischen zwei Programmen, reader.c und writer.c, gearbeitet. Ich konnte die Eingabe für das Rohrprogramm nicht ausführen. Das Pipe-Programm soll einen int aufnehmen, es an das Writer-Programm senden, das dann seine Ausgabe in das Leseprogramm für die endgültige Ausgabe leitet. Unten ist der Code für die drei Klassen. Ich denke, ich bin in der Nähe, aber kann mir jemand helfen, den ersten Int-Input argv [2] in die Writer-Klasse und dann in die Reader-Klasse zu bekommen?Eine Pipe in c zwischen zwei Programmen erstellen

Rohrprogramm (communicat.c)

int main(int argc, char *argv[]) 
{ 
    int fd[2]; 
    pid_t childpid; 
    int result; 

    if (argc != 2) 
    { 
      printf("usage: communicate count\n"); 
      return -1; 
    } 
    pipe(fd); 

    childpid = fork(); 

    if (childpid == -1) 
    { 
     printf("Error in fork; program terminated\n"); 
     return -1; 
    } 

    if(childpid == 0) 
    { 
      close(1); 
      dup(fd[1]); 
      execlp("writer", "writer", fd[1],(char *) NULL); 
    } 
    else 
    { 
      childpid = fork(); 
    } 
    if(childpid == 0) 
    { 
      close(0); 
      dup(fd[0]); 
      close(fd[0]); 
      close(fd[1]); 
      execlp("reader", "reader", (char *) NULL); 
    } 
    else 
    { 
      close(fd[0]); 
      close(fd[1]); 
      int status; 
      wait(&status); 
    } 
    return(0); 
} 

Reader.c

int main() 
{ 
    int count; /* number of characters in the line */ 
    int c; /* input read */ 
    count = 0; 
    while ((c = getchar())!= EOF) 
    { 
     putchar(c); count++; 
     if (count == LINELENGTH) 
     { 
       putchar('\n'); count = 0; 
     } 
    } 
    if (count > 0) 
     putchar('\n'); 
    return 0; 
} 

Writer.c

int main(int argc, char *argv[]) 
{ 
    int count; /* number of repetitions */ 
    int i; /* loop control variable */ 

    if (argc != 2) 
    { 
     printf("usage: writer count\n"); 
     return -1; 
    } 
    else count = atoi(argv[1]); 

    for (i = 0; i < count; i++) 
    { 
     printf("Hello"); 
     printf("hello"); 
    } 
    return 0; 
} 
+0

Warum schließen Sie die Pipe-Dateien nicht, bevor Sie den Writer auf die gleiche Weise wie für den Reader ausführen? – jdarthenay

+0

Auch Leser und Schreiber können nicht auf argc und argv des aufrufenden Programms zugreifen, was sie erhalten, hängt von Ihrer 'exec()' Funktion ab. – jdarthenay

Antwort

1

Correct der Chiffrierer auf diese Weise exec:

if(childpid == 0) 
{ 
    close(1); 
    dup(fd[1]); 
    close(fd[0]); 
    close(fd[1]); 
    execlp("writer", "writer", argv[1], (char *) NULL); 
} 
+0

Danke, das Schließen der FD im Schreiber hat es funktioniert. Ich wusste, dass es so klein war. – Ryan

Verwandte Themen