2012-04-02 8 views
2

Das Programm kann alle Daten aus der Pipe lesen. Allerdings hört das Programm einfach auf. Es kann nicht weiter verarbeitet werden. Ich denke, dass es im Kindprozess aufhört.c pipe: Programm kurz vor dem Warten stoppen (NULL);

//I created two pipe before fork (fd[0] and fd[1]). 
//child process 
if(pid == 0){ 
    close(fd[a][1]); 
    buf[6]; 
    int i; 
    while ((i = read(fd[a][0], buf, 6)) > 0) { 
     printf("%s", buf);  
    } 
    close(fd[a][0]); 
exit(0); 
} 

//parent process 
write(fd[a][1], "12", 2); 
write(fd[a][1], "14", 2); 
write(fd[a][1], "15", 2); 
write(fd[b][1], "12", 2); 
write(fd[b][1], "14", 2); 
write(fd[b][1], "15", 2); 
printf("done!\n"); 
close(fd[0][1]); 
close(fd[1][1]); 
wait(NULL); 
printf("Really done!!!\n"); 
...      // The program cannot run after wait(NULL); 

--output-- 
121415done 
+2

Können Sie ein komplettes Beispiel machen? Siehe http://sscce.org/ –

+0

@Joachim Pileborg Ich habe mehr Details meines Programms zur Verfügung gestellt. –

Antwort

0

Du read in einer while-Schleife Ausgabe, Sperrung selbst wirksam, bis etwas schief geht. Wenn Sie 6 Zeichen lesen müssen, ist dies, wie Sie das Kind Prozess schreiben würde:

char buf[7]; 
int left = 6; 
int so_far = 0; // instead of so_far, (6 - left) could also be used 
while (left > 0) 
    int num_read = read(fd[0][0], buf + so_far, left); 
    left -= num_read; 
    so_far += num_read; 
} 
buf[so_far] = '\0'; 
printf("%s\n", buf);  
+0

Vielen Dank für Ihre Hilfe. Ich habe meinen Code bearbeitet. Das Problem kann die Verarbeitung nach Warten (NULL);. Es wurde jedoch wie folgt ausgegeben (Kind erhält nur den ersten Schreibvorgang. Und es hat falsche Daten erhalten). fertig! Wirklich fertig !!! –

+0

Vielen Dank. Ich habe das Problem gelöst. Dein Code ist perfekt. Eigentlich habe ich einige dumme Fehler gemacht, damit das Programm beim letzten Mal nicht laufen kann. –

+0

Ich habe immer noch ein kleines Problem. Wie kann ich eine Pause im Buf machen? –

0

Die beiden Prozesse in einer Sackgasse gefangen werden, die jeweils für den anderen zu warten. Sie möchten, dass der untergeordnete Prozess die Verarbeitung beendet, aber auf den übergeordneten Prozess wartet, weil er nicht weiß, dass der übergeordnete Server keine weiteren Daten mehr sendet. Um es das Kind klar, das Schreiben Ende des Rohres in der Nähe:

write(fd[0][1], "12", 2); 
write(fd[0][1], "14", 2); 
write(fd[0][1], "15", 2); 
printf("done!\n"); 
close(fd[0][1]); 
wait(NULL); 
+0

Es ist bereits geschlossen (fd [0] [1]) in meinem Code enthalten. Allerdings habe ich es nicht gezeigt. Sorry ..... –

0

ich Sie vermuten, haben nicht die „Schreiben“ fd in den untergeordneten Prozess geschlossen, daher der Aufruf read blockiert, welches wiederum wait im Elternprozess blockiert.

Auch: Wenn Sie etwas aus Ihrer Frage weggelassen haben, wie in der Antwort auf @ anatolygs Antwort, sollten Sie die Frage bearbeiten. Es ist die gleiche Antwort, die ich zuerst gegeben hätte.

+0

Vielen Dank für Ihren Vorschlag. Ich füge schon close fd in den Child-Prozess, aber das Problem immer noch nicht lösen –

+0

@EricTang - Sie müssen 'schließen (fd [1])' oder '[a] [1]' (?) - die * schreiben * Dateideskriptor - im Kindprozess * bevor * du beginnst zu lesen –

+0

Oh, tut mir leid, ich habe es verpasst Aber das Problem ist immer noch hier. –

Verwandte Themen