select() blockiert Threads



  • Hallo,
    der Titel, das ist meine Behauptung und nun würd mich interessieren, ob das stimmt bzw. sein kann. select() selbst liefert mir den Fehler "Interrupted system call", und strace liefert mir ein SIGCHLD als (möglichen?) Verursacher. wenn ich mit sigprocmask() SIGCHLD maskieren versuche, steht trotzdem alles...
    Das ganze ist ne kleine UDP Geschichte mit nem Server der bei ner Anfrage eines Clients fork()t und die Kinder mit Threads arbeiten und die Anfrage des Clients verarbeiten. Das select() findet aber im Vater/Mutter statt, das quasi "ewig" auf Clients wartet. Lösungs- oder weitere Fehlerforschungsvorschläge?

    Danke,
    Massimo



  • select() selbst liefert mir den Fehler "Interrupted system call", und strace liefert mir ein SIGCHLD als (möglichen?) Verursacher.

    SIGCHLD heißt, dass ein Kindprozess terminiert ist. Am besten wär es, dafür einen signal-Handler zu schreiben, der das Ereignis bearbeitet.
    Was "Interrupted system call" bzw. EINTR angeht: Normalerweise solltest du den select-Aufruf direkt neustarten, wenn er durch ein Signal unterbrochen wurde (es sei denn das Signal bewirkt, dass ein Neustart keinen Sinn hätte ... genau deshalb bricht der Syscall ja ab, um dir die Chance für diese Entscheidung zu geben).

    Ich hab leider nicht ganz verstanden, was das Problem ist. Von Threads hast du nicht viel geschrieben, hört sich eher an, als würdest du mit Prozessen arbeiten statt Threads. select blockiert jedenfalls definitiv nicht die Kindprozesse. Schau dir mal einschlägige Literatur an, angefangen mit der libc-Dokumentation (`info libc') bis hin zu Stevens: APUE
    Advanced Programming in the UNIX Environment | ISBN: 0201563177



  • SIGCHLD ist mir bekannt. Hab dann an einer anderen Stelle weitergearbeitet und beim nächsten Testen war der "Interrupted system call" auch schon wieder weg, kann aber nicht wirklich sagen warum der da war... Das mit den Threads hat sich mehr als ein konzeptionelles Problem herausgestellt. Der Literaturhinweis ist mir bekannt, trotzdem Danke für die Hilfe.


Anmelden zum Antworten