Forum: Compiler & IDEs read() timeout


von qwertz (Gast)


Lesenswert?

Hallo,

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

Kann ich für diese Funktion ein timeout definieren?

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


grüße

von Simon B. (nomis)


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

von qwertz (Gast)


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...

von Simon B. (nomis)


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

von Hans-Peter (Gast)


Lesenswert?

qwertz schrieb:
> ist das hilfreich für mich?
Nur wenn der Input von einem Terminal kommt, und du außerdem im 
"noncanonical mode" bist.

von qwertz (Gast)


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 ?

von Simon B. (nomis)


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

von qwertz (Gast)


Lesenswert?

Es läuft.
Coole Sache!
Danke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.