mehrmaliges schreiben in pipes
-
while(nbytes = read(fd[0], readbuffer, sizeof(readbuffer))); printf("Received string: %s", readbuffer);
ersetz das while mal durch
while( (nbytes = read(fd[0],readbuffer,sizeof(readbuffer))) >0)
btw. ist es imho problematisch, sich auf eine 0-Terminierung zu verlassen, vorallem da du die Anzahl der empfangenen Bytes ja kennst!
-
while(nbytes = read(fd[0], readbuffer, sizeof(readbuffer)));
Zusätzlich fällt mir auf, dass das Semikolon hier ungünstig platziert ist.
-
oh, ein Editor mit auto-indent hilft hier
-
ups, k das mit dem Semikolon is evtl net so gut
aber hab das eben nur schnell zusammengeschrieben....
also auch mit
while(nbytes = read(fd[0], readbuffer, sizeof(readbuffer))>0) printf("Received string: %s", readbuffer);
funktioniert es leider nicht.. er gibt mir nur string[0] aus und das wars...
sonst noch irgendwelche ideen?
-
Sui_the_Doc schrieb:
sonst noch irgendwelche ideen?
Gib uns ein lauffähiges Programm, das den Fehler zeigt und dann schauen wir weiter.
-
hm, also ich hoffe das ist es was du willst:
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> int main() { int fd[2], nbytes; pid_t childpid; char string[8][30]; char readbuffer[80]; for (int k = 0;k<8;k++) sprintf(string[k],"bla: %d\n",k); pipe(fd); if((childpid = fork()) == -1) { perror("fork"); exit(1); } if(childpid == 0) { //CHILD close(fd[0]); for(int k = 0;k<8;k++) write(fd[1], string[k], (strlen(string[k])+1)); exit(0); } else { // PARENT close(fd[1]); while(nbytes = read(fd[0], readbuffer, sizeof(readbuffer))) { readbuffer[nbytes] = '\0'; printf("Received string: %s\n", readbuffer); } } return 0; }
Ausgabe ist:
Received string: bla: 0
gewollte ausgabe:
Received string: bla: 0 Received string: bla: 1 Received string: bla: 2 Received string: bla: 3 Received string: bla: 4 Received string: bla: 5 Received string: bla: 6 Received string: bla: 7
-
So ist es besser, beim Lesen aus der Pipe wird nicht zwischen den einzelnen Schreibzugriffen getrennt. Du liest meistens alles was grad in der Pipe ist, und je nach Scheduler kann das schon alles sein, was je in die Pipe geschrieben wurde. In diesem Fall befinden sich alle Strings hintereinander im Buffer durch 0 getrennt. Das printf gibt natürlich nur bis zur ersten 0 aus.
Du kannst dies überprüfen, indem du ein printf("%d\n", nbytes); nach dem read einfügst.
-
so, Danke erstmal für die Antwort...
weißt du evtl auch wie ich das anders regeln könnte??
-
Sui_the_Doc schrieb:
so, Danke erstmal für die Antwort...
weißt du evtl auch wie ich das anders regeln könnte??Egal was du machst, du musst die Nachrichten selbst trennen. Du koenntest einerseits nach 0 oder \n trennen. Andererseits koenntest du zuerst die Länge der Nachricht senden und mit dieser Information die entsprechenden Bytes in deinen Buffer speichern.
Du musst auch bedenken, dass eine Nachricht nicht mit einem read komplett ausgelesen werden muss.
Bei zeilenorientierten Protokollen empfiehlt sich das ganze zu trennen. Auf einer unteren Schicht liest du Daten in die Buffer rein und in einer höheren Schicht werden die Daten in Zeilen oder Tokens getrennt und diese werden dann weiterverarbeitet.
-
naja ich habe es befürchtet... dann hab ich wohl keine wahl...bessten dank für deine mühe.