select() wecken

Genius

Mitglied
Hallo Community,

ich würde gerne ein blockendes select(), das sich in einem thread befindet von der main() aus wecken.

Mein Problem ist, dass ich das fd_set von der main() aus befülle. Die select()-Funktion befindet sich in einer Schleife. Wärend select() blockt ignoriert select() den neuen Socket. Erst wenn eine der bereits bestehenden Verbindungen etwas sendet und ich die Schleife erneut durchlaufe bearbeitet select() auch den neuen Socket.

Ich denke die leichteste Möglichkeit wäre das blockende select() zu wecken und die Schleife einmal ohne etwas zu tun zu durchlaufen. Kann ich ganz gezielt einen socket() innerhalb eines threads zum Beispiel pingen? Habt ihr sonst eine Idee?

Ich hoffe es war verständlich genug, sonst skizziere ich das Programm.

Mit freundlichen Grüßen und vielen Dank
Genius

€dit:
Ein Timeout oder ein "0" (poll) anstatt von NULL innerhalb des timeval structs finde ich sehr unsauber. Ich weiß, dass es so theoretisch gehen würde.
 
Zuletzt bearbeitet:
Wenn du wirklich gegen den Timeout bist, dann erstell die eine Pipe, die du im FD_SET registrierst. Wenn du etwas auf die Pipe schreibst, dann wacht select() auf und du kannst entsprechend darauf reagieren.
 
Warum hältst du das für unsauber? Für deinen Anwendungsfall ist es genau das Richtige.
Es gibt zwei Gründe, warum ich das ganze gerne ohne Timout lösen würde.
1. Soviel ich weiß ist das select()-Timout nicht portabel
2. Ich verliere dadurch Zeit und Resourcen

Wenn du wirklich gegen den Timeout bist, dann erstell die eine Pipe, die du im FD_SET registrierst.
Daran habe ich auch schon gedacht, jedoch verliere ich dann einen meiner 64 FD_SET Plätze :(.

Einer der beiden Tode muss ich wohl sterben - höchstens es hat noch jemand einen genialen Einfall.

Danke für eure Antworten soweit.

Genius

€dit: Ich habe mich für ein Timeout entschieden - ich setze einfach nur dann ein Timout wenn mit dem socket < 64 Personen verbunden sind.
Portabel muss der Code vorerst nicht sein, da er bisher nur auf meinem Server läuft.
 
Zuletzt bearbeitet:
Je nachdem was du vor hast würde ich dir sogar zu einer anderen Technik raten - select ist ein bisschen veraltet ;)
Windows kennt dazu IOCP (I/O Completion Port), Linux epoll und BSD kqueue. Apple kann ich dir nicht sagen. epoll und kqueue sind von der Handhabung her relativ gleich zu select. IOCP arbeitet jedoch komplett anders. Das müsste bei der Umsetzung bedacht werden.
 
1. Soviel ich weiß ist das select()-Timout nicht portabel
2. Ich verliere dadurch Zeit und Resourcen

1. Bist du sicher? Laut http://linux.die.net/man/2/select ist ein Timeout sehr wohl portabel und teil des Posix.1-2001.

Unter Linux gibt es lediglich den Nebeneffekt, das der Timeout-Wert von select() verändert wird, das bedeutet, man muss struct timeval immer neu setzen, bevor man die Referenz an select() übergibt. Aber selbst das ist bei anderen Posix-kompatiblen Systemen nicht wirklich ein Problem - wenn auch unnütz.

2. Zeit kann ich ja noch verstehen, aber was für Resourcen verlierst du dadurch? Die paar Byte für eine struct timeval kann eigentlich kein No-go-Kriterium sein.


Bitte fass das nicht als Kritik auf, ich bin nur daran interessiert, neue Aspekte der Materie kennenzulernen, und vielleicht weißt du ja noch einen Tick mehr darüber.


@_Grubi: Danke für die nette Idee, das behalte ich im Hinterkopf :)
 
Zurück