Prüfen ob Daten in einem FIFO vorhanden sind ohne READ



  • Hallo!

    Ich suche nach einer Funktion, die mir mitteilt, ob Daten in einem FIFO zum Lesen bereit sind ohne dabei mit READ darauf zuzugreifen.

    READ kann ich nicht verwenden (außer ihr wisst eine Möglichkeite), weil ich auf die Daten warten muss (Blocked) aber es vorkommen kann, dass keine Daten ankommen (Absturz etc. des Clients)
    In diesem Fall muss mein Programm reagieren können.

    Das Flag O_NONBLOCKED kann ich nicht verwenden, weil es sonst zu einem zeitlichen Versatz der gesendeten und empfangenen Daten kommen kann.
    Es wird nur alle 10 Sekunden in das FIFO geschrieben bzw. gelesen.

    mfg
    Vanice



  • Kannst du nochmal genau erklären, warum du O_NONBLOCKED nicht verwenden kannst?

    Ansonsten wäre vielleicht ein select() mit einem sehr kurzen Timeout eine Lösung (0 oder 1ms)



  • Hallo Ponto und Danke für deine Antwort!

    Wenn ich mein Programm mit NONBLOCKED laufen lasse liest meist der Server vorher aus dem FIFO bevor der Client schreibt.
    Da ich nur alle 10 Sekunden in das FIFO schreibe hab ich einen zeitlichen Versatz von 10 Sekunden zwischen Senden und Empfangen.

    Hab jetzt eine Lösung mit select() gemacht, funktioniert gut, brauche aber ein langes Timeout von bis zu 2 Sekunden - damit kann ich aber leben.

    Vielen Dank!

    mfg
    Vanice



  • Vanice schrieb:

    Hallo Ponto und Danke für deine Antwort!

    Wenn ich mein Programm mit NONBLOCKED laufen lasse liest meist der Server vorher aus dem FIFO bevor der Client schreibt.
    Da ich nur alle 10 Sekunden in das FIFO schreibe hab ich einen zeitlichen Versatz von 10 Sekunden zwischen Senden und Empfangen.

    Hab jetzt eine Lösung mit select() gemacht, funktioniert gut, brauche aber ein langes Timeout von bis zu 2 Sekunden - damit kann ich aber leben.

    Irgendwie habe ich das Gefühl, dass da was kaputt ist. Ein NONBLOCKED read und select() sollten genau den gleichen Effekt haben.

    Um was für eine Anwendung handelt es sich? Was machen Client und Server? Was macht der Server wenn der Client nichts geschrieben hat?



  • Was macht ein NONBLOCKED read, wenn nichts im FIFO steht?
    Es liest nichts aus, oder?

    Bei meiner Anwendung kann es vorkommen, dass der Client später sendet, als der Server versucht zu lesen.
    Wenn nichts ankommt, wird der Client-Prozess gekillt und eine Routine gestartet, die diesen unter anderem neu generiert und wieder überlagert - vorallem dadurch kann ein solcher zeitlicher Versatz entstehen. Der Client wird vom Server gestartet. (execv)
    Mein Hauptproblem ist wohl, dass ich zwar die aktuelle Laufzeit der beiden Prozesse bestimme, diese aber nicht synchronisiere - vielleicht sollte ich da mal den Hebel ansetzen, hab aber noch keine Idee wie.

    Mein read/write sieht nämlich so aus:

    if (tDiffTime % 10 == 0 && tDiffTime != 0)
    read bzw. write ...

    Und eben diese tDiffTime kann unterschiedlich sein.
    (tDiffTime wird aus der aktuellen Zeit - der Startzeit gebildet)


Anmelden zum Antworten