read() timeout

#3195937
Lesenswert?

qwertz schrieb:
> ich benutze die read() funktion, welche aber leider immer stecken
> bleibt, wenn es nix zum lesen gibt.

Welches Betriebssystem? Das folgende bezieht sich auf Linux.

> Kann ich für diese Funktion ein timeout definieren?

Nein, aber Du kannst beim open() das O_NONBLOCK-Flag mitgeben, dann 
kommt read() sofort mit 0 Bytes zurück wenn keine Daten vorliegen.

Dann musst Du aber ein Weilchen warten bevor du weiterliest, sonst hast 
Du ein übles busy-looping implementiert.

> Finde dazu leider nur sehr abgehobene Beispiele die ich nicht
> verstehe...

Man löst das normalerweise mit poll() oder select(), mit denen man 
mehrere Filedeskriptoren überwachen und auf die Verfügbarkeit von Daten 
reagieren kann. So hart ist das nicht, man muss da nur einmal ein 
Verständnis dafür entwickeln - dann werden plötzlich viele Dinge 
einfacher.

Viele Grüße,
        Simon
Gast #3195948
Lesenswert?

Jap - Linux.

ich habe folgendes gefunden:

struct termios  config;
config.c_cc[VTIME] = 1; // Inter-character timer off

ist das hilfreich für mich?

> Man löst das normalerweise mit poll() oder select(), mit denen man
> mehrere Filedeskriptoren überwachen und auf die Verfügbarkeit von Daten
> reagieren kann. So hart ist das nicht, man muss da nur einmal ein
> Verständnis dafür entwickeln - dann werden plötzlich viele Dinge
> einfacher.

ich werde mal da nach suchen...
#3195954
Lesenswert?

qwertz schrieb:
> ich habe folgendes gefunden:
>
> struct termios  config;
> config.c_cc[VTIME] = 1; // Inter-character timer off
>
> ist das hilfreich für mich?

Öh, eher nicht. Das konkrete flag kenne ich nicht. Aber die geschichte 
mit dem Blocking löst das soweit ich das jetzt überblicke nicht.

>> Man löst das normalerweise mit poll() oder select(), mit denen man
>> mehrere Filedeskriptoren überwachen und auf die Verfügbarkeit von Daten
>> reagieren kann. So hart ist das nicht, man muss da nur einmal ein
>> Verständnis dafür entwickeln - dann werden plötzlich viele Dinge
>> einfacher.
>
> ich werde mal da nach suchen...

Hier hatten wir das neulich schonmal:

Beitrag "Re: Linux C Read von ttys0"

Viele Grüße,
        Simon
Gast #3195971
Lesenswert?

okay, bevor ich mir jetzt dein Poll Programm zu Gemüte führe.

Geht das ganze auch mit einem Socket?

 /* Create CAN socket */
    int skt = socket( PF_CAN, SOCK_RAW, CAN_RAW );


kann ich mein skt genauso behandeln wie dein serial_fd ?
#3195989
Lesenswert?

qwertz schrieb:
> Geht das ganze auch mit einem Socket?
>
> kann ich mein skt genauso behandeln wie dein serial_fd ?

Ja. Ich kenne zwar CAN nicht konkret, aber das sollte tun: Das socket 
wird auch durch einen filedeskriptor repräsentiert.

Das schöne daran ist halt, dass Du auch mehrere unterschiedliche Sachen 
innerhalb eines poll() überwachen kannst: serielle Schnittstellen, 
Dateien, Netzwerk- und CAN-Sockets. Du packst mehrere struct pollfds in 
ein Array, packst da die filedeskriptoren und die zu überwachenden 
Events rein, übergibst die Anzahl und den timeout an poll und wartest 
dass einer von denen bereit wird   :)

So funktionieren unter anderem auch die ganzen Event-Loops von den 
high-level GUI-toolkits.

Viele Grüße,
        Simon

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren