datenaustausch über pipes
-
Hi,
ich hab hier folgendes programm welches einen kindprozess erstellt der übereine pipe daten vom elternprozess über eine pipe liest. leider funktioniert das ganze nicht nur versteht ich nicht wieso. hier der code:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <time.h> int main(int argc, char **argv) { float puffer[20]; pid_t pid; int pi[2]; if(pipe(pi) < 0) { perror("failed create pipe"); return EXIT_FAILURE; } pid = fork(); if (pid == 0) { float sum = 0; close(pi[1]); read(pi[0],puffer,10); int i; for(i = 0;i < 10;i++) { sum = sum + puffer[i]; printf("%f ",puffer[i]); } printf("\n"); printf("sum: %f\n",sum); sleep(1); } else { float array[]={19.0,9.0,17.0,15.0,4.0,12.0,6.0,3.0,4.0,136.0}; close(pi[0]); write(pi[1],array,10); if ((waitpid (pid, NULL, 0)) < 0) { perror ("waitpid"); exit (EXIT_FAILURE); } } };
Die Ausgabe:
19.000000 9.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
sum: 28.000000
ich versteh nicht wieso hier nicht alle daten im puffer stehen sondern einfach immer irgendwelche werte. sollte read(.. im kindprozess nicht solange warten bis alle daten übertragen wurden?
lg
-
Guck dir nochmal genau die Beschreibung von read an. Falls du von C++ oder einer anderen abstrakten Sprache kommst, ist das vielleicht etwas ungewohnt, dass Funktionen sich nicht auf den Typ ihrer Argumente einstellen können, aber so ist das in C nun einmal.
Gleicher Fehler beim write.
-
irgendwie komm ich nicht drauf. funktioniert das ganze vl nur mit dem datentyp char?
-
Sag mal, was du dir als Referenz zu read und write durchgelesen hast.
xxmaxx schrieb:
funktioniert das ganze vl nur mit dem datentyp char?
Nicht raten! Lesen!
http://www.google.com
http://www.cplusplus.com/reference/clibrary/
http://linux.die.net/man/
-
Das 3.Argument für read/write ist falsch, lies dir die Spezifikation zu read/write durch; dabei wirst du auch bemerken, dass diese Funktionen Rückgabewerte liefern, die dazu da sind, ausgewertet zu werden.
-
ok es war gestern wohl schon zu spät. auf galiliocomputing stand halt:
Die maximale Anzahl der Daten, die in eine Pipe geschickt werden können, sind mit der Konstante PIPE_BUF (in limits.h) definiert.
hab da angenommen das dritte argument gibt die länge der zu übertragenden zeichen an. da hätt ich lange suchen können.
jetzt funktionierts.
danke an alle
-
xxmaxx schrieb:
auf galiliocomputing stand halt:
Da steht nur Müll.
-
Da kann ich Wutz nur zustimmen. Was ist denn die "maximale Anzahl von Daten"? Das ist so unpräzise, dass man es eigentlich nicht verstehen kann.