Filehandle nur zu schreiben geöffnet vc selectloop

Begonnen von herrmannj, 28 Oktober 2016, 22:06:08

Vorheriges Thema - Nächstes Thema

herrmannj

Moin Rudi,

ich habe ein filehandle welches nur zum schreiben geöffnet ist. Das zugehörige modul führt das handle unter $hash->{FD} und ist in %selectlist registriert.

Kann ich es irgendwie verhindern das die main select loop versucht das handle zu lesen ? Sie tut das aktuell und läuft deshalb ständig in Fehlermeldungen

fhem.pl
  foreach my $p (keys %selectlist) {
    my $hash = $selectlist{$p};
    if(defined($hash->{FD})) {
      vec($rin, $hash->{FD}, 1) = 1
        if(!defined($hash->{directWriteFn}) && !$hash->{wantWrite} );
      vec($win, $hash->{FD}, 1) = 1
        if( (defined($hash->{directWriteFn}) ||
             defined($hash->{$wbName}) ||
             $hash->{wantWrite} ) && !$hash->{wantRead} );
    }


Danke vg
joerg

herrmannj

#1
hat sich möglicherweise erledigt ...

rudolfkoenig

ZitatKann ich es irgendwie verhindern das die main select loop versucht das handle zu lesen ?
Da ich unsicher bin, ob du nur umgangsprachlich redest: die main select loop sollte nie lesen, nur melden, dass was zu lesen gibt, aka Lesepruefung.
Man kann ein FD nur fuer Lese- oder Schreibpruefung anmelden. Grob: falls $hash->{directWriteFn} gesetzt ist, dann wird die Schreibpruefung durchgefuehrt, sonst Lesepruefung. Wg. SSL gibts da noch die wantWrite/wantRead flags, aber wenn man diese nicht setzt, dann gilt nur directWriteFn.

herrmannj

#3
Umgangssprachlich. Select prüft nur, ist schon klar. wantWrite/wantRead für SSL ist ebenfalls klar.

Ich habe die Thematik mittlerweile auch lösen können.

Um noch einmal klarer zu beschreiben, Beispiel:

Ein Handle ist nur zum schreiben geöffnet. Wenn geschrieben werden soll, wird dirctWriteFn vom zugehörigen modul gesetzt. Steht keine Ausgabe an wird directWriteFn entfernt. In der main select loop findet folgendes statt:

  if(defined($hash->{FD})) {                               -> true, das Handle ist gesetzt
    vec($rin, $hash->{FD}, 1) = 1 if                     -> wird zum "warte auf lesen registriert wenn (siehe die beiden Folgebedingungen)
      (!defined($hash->{directWriteFn})                -> keine directWriteFn existiert. TRUE, directWriteFn entfernt da keine Ausgabe anliegt
       && !$hash->{wantWrite} );                          -> SSL Flag, hier nie gesetzt, Bedingung daher ebenfalls TRUE.

Daher wird das FH in die select mit "lesen" aufgenommen obwohl das Handle nur zum Schreiben dient.

Das hat unter speziellen Bedingungen zu Fehlern geführt (es wurde gemeldet "Lesen möglich" obwohl das Handle ja nur zum Schrieben geöffnet ist).

Du musst aber vorerst nichts tun da dies nur unter sehr speziellen Bedingungen auftritt. Das Eintreten dieser Bedingung kann ich umgehen, dann tritt nichts mehr auf. Daher -> Gelöst.

Danke, vg
joerg