Frage zu Read - Blockierung beim FIFO

M

macke_a

Mitglied
Hallo ! Folgenden Text habe ich über Pipes gefunden. Dabei geht es mir darum, was read macht, wenn keine Daten mehr im Fifo sind.

read: Die Daten werden in der Reihenfolge gelesen, wie sie geschrieben wurden (FIFO-Prinzip). Sie können nicht zurückgegeben und auch nicht nocheinmal gelesen werden. Wenn die Pipe leer ist, blockiert read normalerweise solange bis neue Daten in der Pipe vorliegen. Falls die Pipe auf der Schreibseite geschlossen wurde, liefert read stattdessen das Resulat 0. Das die Anzahl der zu lesenden Bytes angebende Argument von read wird nicht immer befriedigt, nur wenn genügend Daten vorliegen. Sonst werden gerade so viel Bytes gelesen, wie in der Pipe zur Verfügung stehen.

Was bedeutet das für meinen aktuellen Prozess? Blockierung?
Bleibt man Prozess dann stehen?

Nun, da ich n. der Linux Freak bin, wäre es nett wenn mir jemand von Euch dieses mal näher erläutern könnte !

Danke!

Mfg macke_a
 
Mahltid,

Angenommen, wir haben uns eine entsprechende Gerätedatei: 'InterProc.fifo' erstellt, und wollen nun zwei Prozesse darauf zugreifen lassen. Hier mal der schreibende...

Code:
#include <signal.h>
     .
     .

void fMyCustomSigHndl(int);

void fMyCustomSigHndl(int hFIFO_toClose) 
{ 
   perror("write");
   close(hFIFO_toClose);
   exit(SIGPIPE);
}

int main(int argc, char** argv) 
{
  int hMyFIFOBuffer;                    
  int iWrittenBytes;
  char *szPipedText = "Ich bin ein gepipter Text\n";


  hMyFIFOBuffer = open("InterProc.fifo",2);                  
  
  if (hMyFIFOBuffer < 0)
  {
        perror("open");
        exit(1);
  }

  iWrittenBytes = write(hMyFIFOBuffer, text, strlen(text));
  if (iWrittenBytes != strlen(text)) /* ist wohl nicht alles empfangen worden ? */
  {
     signal(SIGPIPE,fMyCustomSigHndl(hMyFIFOBuffer));  /* ruft die Funktion: 'fMyCustomSigHndl()' auf, wenn für diesen Prozess kein beschreibbares PIPE-Ende mehr vorhanden ist... */
  }
  close(hMyFIFOBuffer);
  return 0;
}

Also, nochmal:

macke_a schrieb:
Was bedeutet das für meinen aktuellen Prozess? Blockierung?
Bleibt man Prozess dann stehen?

Der schreibende Prozess löst das Signal: SIGPIPE aus, auf das Du irgendwie abfangen musst um darauf reagieren zu können. Im Zweifelsfall, ist der schreibende Prozess durch schließen des entspr. Handles zu beenden, oder wie im Beispiel zu sehen, es wird eine Funktion aufgerufen, in der dann wiederum alternative Aktionen ausgeführt werden können (hier auch nur Handle zurückgesetzt, und schreibenden Prozess beendet!).
Für den anderen Fall, d.h. Du willst aus einer PIPE lesen, und der schreibende Prozess stopt die Übertragung, so wird 'read()' solange ausgeführt, bis entweder wieder Daten über die PIPE strömen, bzw. bis der schreibende eben wieder SIGPIPE signalisiert...

Hoffe das hat geholfen...

...MfG
 
Zuletzt bearbeitet:
Zurück
Oben