Forum: PC-Programmierung IPC mit FIFOs, read blockieren


von J. K. (jkraemer)


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?

von Volker Z. (vza)


Lesenswert?

Hallo
read blockiert nicht, weil es einen Fehler zurück gibt.

IPC sind nicht (nicht ohne weiteren Aufwand) zum Schließen gedacht.

Nach Erhalt der entsprechenden Fehlernummer, musst du den Kanal 
schlissen und wieder neu aufmachen.

Volker

von J. K. (jkraemer)


Lesenswert?

Das verstehe ich jetzt nicht ganz.
Es muss doch möglich sein, dass der schreibende Prozess zu einem 
beliebigen Zeitpunkt den FIFO öffnet, schreibt und schließt.
read() liefert bei dem (ungewollten) loop eine 0 zurück, was doch 
eigentlich kein Fehler ist, sondern nur signalisiert, dass er 0 bytes 
gelesen hat.

von Volker Z. (vza)


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

von J. K. (jkraemer)


Lesenswert?

Es geht um FIFOs unter Linux, genau. Das habe ich vergessen zu erwähnen.

Ich habe da wohl tatsächlich etwas durcheinander gebracht. Jetzt 
funktioniert alles prima ;) Vielen Dank!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.