2017-04-01 2 views
0

Ich habe ein Problem mit dieser Hausübung. Ich lerne Linux C, also bin ich ein Anfänger.Linux C - Kindprozess denkt, das Rohr ist leer

Jetzt ist die Übung einfach: Ich muss einen Kindprozess erstellen. Jetzt muss der Elternprozess eine Textdatei (z. B. a.txt) lesen und durch eine Pipe senden. Der untergeordnete Prozess liest aus der Pipe und druckt den Inhalt der Pipe auf das Terminal. Aber ich verstehe nicht, dass der Child-Prozess die Pipe nicht liest, weil sie denkt, dass die Pipe leer ist.

ich den Code schreiben, was ich bisher getan:

#include "myinclude.h" //a separate file which contains all needed headers to run the program. 

#define MERET 80 

int main(int argc,char *argv[]){ 

    int pfd[2]; 
    int status; 
    char buffer[MERET]; 
    pid_t pid; 
    FILE *fp1,*fp2; 
    if(argc != 2){ 
     printf("Nincs eleg argumentum"); 
    } 
    if(pipe(pfd) < 0){ 
     syserr("pipe"); 
    } 
    if((pid = fork()) < 0){ 
     syserr("fork"); 
    } 
    if(pid == 0){ 
     close(pfd[1]); 
     if ((fp1 = fdopen (pfd[0],"r")) <0){ 
        syserr("fdopen"); 
      } 
     printf("mukodsz"); 
     while(fgets(buffer,MERET,fp1) != NULL){//something here is not good 
      printf("%s",buffer); 
      fprintf(stdout,"Siker"); 
     } 
     close(pfd[0]); 
     exit(0); 
    } 
    close(pfd[0]); 
    if ((fp1 = fdopen (pfd[1],"w")) == NULL){ 
     syserr("fdopen"); 
    } 
    if((fp2 = fopen(argv[1],"r")) < 0){ 
     syserr("fopen"); 
    } 
    while(fgets(buffer,MERET,fp2) != NULL){ 
     fprintf(fp1,"%s",buffer); 
     //fprintf(stdout,"Siker\n"); 
    } 
    close(pfd[1]); 
    wait(&status); 
    //fprintf(stdout,"Siker"); 
    exit(0); 
} 

In meiner Sprache "siker" bedeutet Erfolg. Ich benutzte es, um das Programm zu debuggen, aber while-Schleife des Kindprozesses druckt nichts.

Antwort

1

Wenn Sie fdopen. Sie müssen fclose.

Wenn Sie stattdessen den ursprünglichen Dateideskriptor close verwenden, gehen alle noch nicht geschriebenen Daten in den Puffern verloren, die dem FILE* zugeordnet sind.

+0

Sie haben Recht! Danke für das Lösungsproblem! – Zsombi

Verwandte Themen