2016-10-18 5 views
1

Ich versuche, Informationen aus dem Kindprozess an den übergeordneten Prozess in diesem Programm zu übergeben. Hier ist der Code so weit, noch auf der Arbeit es Reinigung:Fehler beim Versuch, eine Datei zu summieren und über Pipe/Fork/Process zu übertragen?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

main() { 

    char *s, buf[1024]; 
    int fds[2]; 
    int sum; 
    s = "Hello world!\n"; 
    FILE *file; 
    pipe(fds); 

    if(fork()==0){ 
     printf("child process: \n"); 
     int c; 
     int number; 
     sum = 0; 

     file = fopen("file1.dat", "r"); 
     if (file) { 
      while ((c = getc(file)) != EOF){ 
       sum+=c;  
       printf("child process: step 1"); 
       fclose(file); 
      } 
     } 

     write(fds[1],&sum,12); 
     exit(0); 
    } 
    read(fds[0],buf,12); 
    write(1,buf,strlen(s)); 

} 

Es kompiliert korrekt und ohne Fehler, aber kehrt die Nummer 6, gefolgt von einer Reihe von nicht erkannten Zeichen (Fragezeichen), wenn ich es laufen.

Was könnte ich vermissen? Meine Sinne sagen mir etwas mit dem Lesen.

Edit: Ich sollte hinzufügen, dass meine Absicht für den Kindprozess ist zu öffnen und lesen Sie die Datei (die mehrere Zeilen von Zahlen enthält) und addieren sie, und geben Sie die Summe an den übergeordneten Prozess zurück.

Antwort

3

Angenommen sizeof(int) == 4 schrieb man 12 beliebiges Bytes (4 davon stellen den int Wert von sum - die andere 8 Bytes geben undefiniertes Verhalten, da sie nicht Teil des ‚selber Array‘, wie sum sind) auf das Rohr, und dann lesen Sie sie in buf. Dann versuchen Sie, die willkürlichen Bytes auf Standardausgabe mit write() zu drucken.

Sie überprüfen nicht auf Fehler; Du solltest.

Sie müssen die Bytes zurück in einen ASCII-Ziffernstrom konvertieren, um den Wert zu verstehen. Sie sollten write(fds[1], &sum, sizeof(sum)) verwenden, um zu schreiben, und read(fds[0], &sum, sizeof(sum)) lesen, und dann können Sie mit printf("%d\n", sum); drucken. Oder Sie können die Konvertierung selbst durchführen und trotzdem write() verwenden, um die konvertierte Zeichenkette zu drucken. Oder Sie können die Umwandlung von sum in eine Ziffernfolge im Kind vornehmen. Oder ...

+0

Vielen Dank für die Antwort. Ich werde einen Blick darauf werfen und sehen, ob das mein Problem ist. –

Verwandte Themen