select() mit 0 als timeout hängt sich auf



  • Wenn ich bei select() als timeout 0 einstelle, hängt sich mein programm in einem unendlichen timeout von select auf. Das sagt mir strace.
    Sobald ich aber das timeout von select() auf mindestens 1 usec stelle funktionierts. Hat jemand eine Ahnung warum?

    mfg.



  • Das ganze lässt sich doch nicht so einfach beheben, denn wenn ich die Wartezeit auf 1 stelle, habe ich bei strace trotzdem noch einige select() Aufrufe mit ner {0,0} timestruct obwohl so eine gar nicht in meinem Programm existiert?!? Darf ich nicht immer die gleiche Timestruct verwenden?
    Außerdem ist mir noch aufgefallen, dass es bei dem FD_SET sich aufhängt, welches für schreibbarkeit geprüft wird, also beim fd_set für errors geht's einwandfrei.
    Hat jemand ne Ahnung? Ich bin am verzweifeln...

    mfg.



  • Hier nochmal die Ausgabe wenn ich 0 als Wartezeit übergebe:

    select(4, NULL, NULL, [3], {0, 0})      = 0 (Timeout)
    select(4, [3], NULL, NULL, {0, 0})      = 0 (Timeout)
    select(4, NULL, NULL, [3], {0, 0})      = 0 (Timeout)
    select(4, [3], NULL, NULL, {0, 0})      = 0 (Timeout)
    select(4, NULL, NULL, [3], {0, 0})      = 0 (Timeout)
    select(4, [3], NULL, NULL, {0, 0})      = 0 (Timeout)
    select(4, NULL, NULL, [3], {0, 0})      = 0 (Timeout)
    select(4, [3], NULL, NULL, {0, 0})      = 0 (Timeout)
    select(4, NULL, NULL, [3], {0, 0})      = 0 (Timeout)
    select(4, [3], NULL, NULL, {0, 0})      = 0 (Timeout)
    select(4, NULL, NULL, [3], {0, 0})      = 0 (Timeout)
    select(4, [3], NULL, NULL, {0, 0})      = 0 (Timeout)
    select(4, NULL, NULL, [3], {0, 0})      = 0 (Timeout)
    select(4, [3], NULL, NULL, {0, 0})      = 0 (Timeout)
    

    Und das dann ganz oft, obwohl doch eigentlich was gesendet/empfangen wird. Wenn ich aber die Wartezeit auf eine Sekunde stelle, dann geht's. Achja: Unter Windows funktioniert der ganze Code mit 0, nur bei Linux will es nicht.

    mfg.



  • Du musst natürlich vor jedem select Aufruf die timeval Struktur füllen, dann kannst Du auch immer dieselbe benutzen. Wenn der Timeout 0 ist, sollte select auch sofort zurückkehren. Wenn der Timeout NULL ist (also garkein Pointer übergeben), wartet select unendlich lange.

    Die Ausgabe von strace sieht mir so aus als ob Du eine timeval Struktur die mit 0 Werten gefüllt ist übergibst, also so dass select sofort zurückkehrt (mit dem Rückgabewert 0, also keine Änderung im Status der Filedescriptoren).

    Am besten Du stellst mal etwas Code ein, ich vermute irgendwie bei Deinen fd_sets ist was faul.


Log in to reply