IPC mit FIFOs, read blockieren

#2336132
Lesenswert?

Hallo,

derzeit beschäftige ich mich mit FIFOs und möchte 2 getrennte Prozesse 
darüber kommunizieren lassen.

Ein Prozess soll permanent lesen:
1
fifohandle = open("fifo", O_RDONLY);
2
while(1) {
3
  read(fifohandle, buf, BUFLEN);
4
  printf("%s\n", buf);
5
}

Der andere Prozess schreibt (asynchron):
1
buf[BUFLEN]="hallo welt";
2
fifohandle = open("fifo", O_WRONLY);
3
write=(fifohandle, buf, BUFLEN);
4
close(fifohandle);

Der lesende Prozess soll nicht anderes tun, als den FIFO zu beobachten 
und den Inhalt auzugeben. Dieser Prozess wird gestartet und er blockiert 
bei read(), bis der andere Prozess etwas hineinschreibt.
Es wird der String eingelesen und ich hätte erwartet, dass im 
nachfolgenden Durchlauf der while-Schleife die read-Funktion wieder 
blockiert. Schliesslich ist der FIFO leer und vom schreibenden Prozess 
wieder geschlossen worden. Das ist aber nicht der Fall, nach dem ersten 
Schreiben in den FIFO rasselt die while-Schleife munter durch; das 
Blockieren funktioniert also nur bis zum ersten Schreibzugriff.

Wie kann ich read danach blockieren bzw. gibt es eine andere Technik?
#2336288
Lesenswert?

Mein Irrtum, habe gedacht es wäre  wie pipes unter Windows.

Ich nehme mal an du verwendest Linux?
Ich nehme weiter an du hast vorher mkfifo() aufgerufen?

Dann:
Beim close() von Sender erhält der Empfänger ein EOF.
Dies Zeichen ist nicht druck bar. Des weiteren heißt ein Rückgabewert 
von Null bei read() EndOfFile.

Also alles korrekt. Nur deine Interpretation ist falsch.

http://linux.die.net/man/2/read

http://cs.uwindsor.ca/~kobti/60-256/c7-2.pdf

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren