Mehrere Fragen zu read(), select() und der termios-Struktur
-
Hallo beisammen,
ich habe mich etwas intensiver mit der Datenübertragung über die serielle Schnittstelle befasst. Einige Fragen konnte ich bisher nicht beantworten:
1. Was ist genau der Unterschied zwischen select() und read(), wenn man mit select() nur Lesenmengen überprüft und read() im nichtblockierenden Modus betreibt (bzw. open mit der Option O_NONBLOCK öffnet)?
2. Wo liegt der Unterschied, wenn man read() im nichtblockierenden Modus betreibt (bzw. open mit der Option O_NONBLOCK öffnet) und in der termios-Struktur den nichtkanonischen Modus nutzt und dann MIN=0 und TIME=0 einstellt? Für diesen Fall (nichtkanonischer Modus, MIN=0 und TIME=0) findet sich im Buch "Linux Programmierung von Richard Stones und Neil Matthew folgender Text: "In diesem Fall kehrt read immer sofort zurück. Wenn Zeichen vorhanden sind, werden sie zurückgeliefert; wenn keine zur Verfügung stehen, liefert read 0 zurück und es wurden keine Zeichen gelesen." Meiner Meinung macht read() im nichtblockierenden Modus genau das gleiche, oder nicht????
3 Wo liegt der Unterschied, wenn man read(.., .., 1) (dritter Parameter = 1, also ein Zeichen lesen) aufruft und in der termios-Struktur den nichtkanonischen Modus nutzt und dann MIN=1 und TIME=0 einstellt? In o.g. Buch findet sich zu diesem Fall nämlich folgender Text: "Hier wartet read so lange, bis mindestens MIN Zeichen gelesen werden können und liefert anschließend die Anzahl der gelesenen Zeichen zurück. Am Ende der Datei liefert die Funktion 0 zurück."Meiner Meinung macht read(.., .., 1) im blockierenden Modus genau das gleiche, oder nicht????
Ich hoffe, dass sich jemand erbarmt und mir Antwort gibt. Ich weiß, es ist etwas speziell...
Viele Grüße, Epfelsaft
-
Was meinst du mit "wo ist der Unterschied zwischen read() und select()"?
Die Funktion select() liest keine Zeichen ein!!!! Sie prüft nur, ob innerhalb eines vorgegebenen Timeouts Zeichen empfangen werden.Martin
-
Hallo,
ja, stimmt. Was ich wissen wollte: gibt es einen Vorteil von select() wenn ich eigentlich nur einzelne Bytes von der seriellen Schnittstelle abholen möchte? Ich meine arbeitet select() irgendwie schneller / CPU-schonender oder einfach besser?
Bisher habe ich immer mit select() geprüft, ob Daten ankamen um sie danach mit read() einzulesen. Ist das überhaupt nötig? Oder kann ich das auch mit einem (nichtblockierenden) read() machen?
Ich weiß, ist nicht ganz leicht zu verstehen, aber ich hoffe, ich konnte es trotzdem verständlich erläutern, was ich meine.
Gruß, Epfelsaft...
-
Ja, das funktioniert (hab's unter Cygwin ausprobiert).
read() liefert eine "-1", wenn keine Daten anliegen und setzt den Error-Code EAGAIN (Resource temporary not available). Das heißt, dass du im Falle eines "Fehlers" von read() prüfen musst, ob "errno == EAGAIN". Falls nicht, ist ein "echter" Fehler aufgetreten.Der Vorteil von select() ist (neben der Möglichkeit einen Timeout zu setzen), dass man mehrere Datei-Deskriptoren gleichzeitig "überwachen" kann. Beispielsweise in einem Terminal-Programm kann man mit select() gleichzeitig auf eine Eingabe von der Tastatur (stdin) und Daten von der Schnittstelle (/dev/ttyS0) warten. Kommen keine Zeichen an, ist das Programm automatisch "idle".
Martin