Re: Ansteuerung einer seriellen Schnittstelle

From: Bernd Walter <ticso(at)cicely8.cicely.de>
Date: Mon, 25 Mar 2002 11:28:05 +0100

On Mon, Mar 25, 2002 at 01:06:49AM +0000, Peter Much wrote:
> <logix(at)foobar.franken.de> aka Harold Gutch schrieb
> mit Datum Sun, 24 Mar 2002 15:09:57 +0100 in m2n.de.fbsd.questions:
>
> !> [EINVAL] The pointer associated with d was negative.
> !> Nun d ist der Filedescriptor - das hat eindeutig andere Gründe als
> !> non-blocking - fcntl verändert ja nicht den descriptor.
> !> Vermutlich hast du da einen neuen Fehler reingemacht.
> !
> !GNA, ja, hab ich - und zwar beim Schreiben der Mail. Der
> !read()-Aufruf liefert EAGAIN zurueck, das Verhalten deckt sich
> !also fuer mein Verstaendnis genau mit dem im blocking-Fall.
>
> Das ist ja auch richtig. Nonblocking read() findet entweder
> bereits ein Zeichen im Device vor, dann bringt er das zurueck,
> oder er findet grad keines, dann kommt er auch sofort zurueck,
> und zwar mit EAGAIN (dachte immer das hiesse EWOULDBLOCK).

Aus FreeBSD errno.h:
EAGAIN 35 /* Resource temporarily unavailable */
EWOULDBLOCK EAGAIN /* Operation would block */

Aus Solaris errno.h:
EAGAIN 11 /* Resource temporarily unavailable */
EWOULDBLOCK EAGAIN

> -> es macht kaum Sinn, nonblocking read() nicht in einer
> Schleife aufzurufen - und da diese Schleife netterweise _immer_
> vom Interface lesen und den Kram irgendwo zwischenlagern
> sollte (auch waehrend dem write()), brauchen wir auch wieder
> einen Extra-Thread dafuer, sonst wird es haesslich - hupft
> sich also nix. Oder man bringt dem Interface bei, dass es
> ordentlich puffert. (Aber hier ist ja nichtmal klar, ob das
> ding grad canonical oder noncanonical -d.h. zeilen- oder
> zeichen-orientiert- laeuft.)

Threads und non-blocking ist was anderes.
Bei FreeBSDs pthreads wird zwar im Hintergrund auch auf non-blocking
geschalten, aber das ist was anderes.
Du musst allerdings für jedes Filehandle schon einen eigenen Context
verwalten.
Line discipline ist eine tty Geschichte - er wird wohl cuaa* benutzt
haben.
Zu dem Thema tty/seriele haben wir ein Cosmo-Project Treffen,
wer also in der Nähe wohnt und vorbeischauen möchte...

> Dann gibt es ja noch ein huebsches Problem: da die antwort
> auf ein Kommando mit der Baudrate reinplaetschert, weisst du
> erstmal nicht, wie lange du lesen musst. Der read hat -egal
> ob blocking oder nicht- irgendwann zwischendurch genug und
> kommt zurueck. So ein Ding sauber zu gestalten ist nicht
> ohne - aber eine sehr huebsche Uebung. ;-)))

So eine select/pool/kqueue loop ist ein Standartfall, wenn wann das
einmal gemacht hat nutzt man das immer wieder.
Sehr empfehlenswert »Advanced Programming in the UNIX Environment«

-- 
B.Walter              COSMO-Project         http://www.cosmo-project.de
ticso(at)cicely.de         Usergroup           info(at)cosmo-project.de
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Mon 25 Mar 2002 - 11:30:40 CET

search this site