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
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
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...
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
qwertz schrieb: > ist das hilfreich für mich? Nur wenn der Input von einem Terminal kommt, und du außerdem im "noncanonical mode" bist.
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 ?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.