[C] select() manuell dazu bewegen, zurückzukehren

CyberReX

Grünschnabel
Hi!

Ich arbeite zur Zeit an einer Anwendung für Linux, die in zwei Threads läuft.
Der erste kümmert sich um Sockets während der zweite Daten von einem Gerät liest, dass über eine CANaerospace PCI Karte angeschlossen ist.
Im Moment denke ich darüber nach select() in beiden Threads zu verwenden, aber .......
Das Programm soll folgendes erledigen:
1. Daten von einem CAN Gerät empfangen und an alle Clients senden.
2. Daten von einem Client empfangen und diese an das CAN Gerät schicken.
Man stelle sich folgendes vor:
Im ersten Thread blockiert select() bis Daten von einem Socket lesbar sind. Im zweiten Thread kehrt select() zurück und empfängt Daten. Jetzt müsste ich der select() Funktion im ersten T. sagen, dass Daten zu senden wären, die select() Funktion darauhin ihrerseits zurückkehrt und die Daten im Puffer gesendet werden.
(Selbiges soll auch in die andere Richtung funktionieren.)
Wie erreiche ich nun, dass ich select() sozusagen manuell 'auslöse'?

Ich wäre für jede Hilfe oder Vorschläge wie man es anders lösen könnte sehr dankbar!

MfG,
CyberReX
 
Hallo,
ich habe es selber noch nicht versucht, aber sollte es nicht so sein, das
wenn alle beide select() Aufrufe am selben Socket horchen,
alle beide automatisch zurückkehren wenn ein Event am Socket eintritt?

Gruß

RedWing
 
Ich weiß jetzt nicht ob du mich falsch verstanden hast aber das bringt mich auf eine Idee.
Es horchen zwar nicht beide am selben Socket aber würde ich beide select()s auf beide file descriptors legen, würde z.B. die select() im Socket Thread auch zurück kehren wenn ich Daten vom CAN Gerät empfange und damit könnte ich die empfangenen Daten sofort raussenden. Und umgekehrt wenn ich Daten von einem Client empfange sie an das CAN Gerät senden. :)
Danke soweit für den Denkanstoß, ich werde mich heute Nachmittag dran machen es zu verwirklichen.
 
Eigentlich kann ich mir sogar den 2. Thread sparen. :p
Ich seh schon ich hab mal wieder viel zu kompliziert gedacht. Ich brauche nur einen Thread, nur ein fd_set und nur einen select() Aufruf.
 
Hallo,

mich würde noch intressieren obs geklappt hat eventuell profitieren andre
(mich eingeschlossen) auch von deiner Lösung.

Danke und Gruß

RedWing
 
Das ganze ist ein Schulprojekt im Rahmen des Sunrise Projekts des Max-Planck-Instituts für Sonnensystemforschung und ich habe leider nur Dienstags Zugriff zum Rechner auf dem das Programm laufen soll. Ich halte euch auf dem Laufenden.
 
Zurück