Welche Möglichkeit gibt es, einen select()-Aufruf, der ohne Zeitbegrenzung parameterisiert ist, abzubrechen? Es geht um das Programmende.
Nachtrag: das Betriebssystem ist Linux, ein Schließen des Dienst-Sockets beendet select() leider nicht....
Da select() nur dazu da ist, zu blockieren und zurückzukehren, bietet es natürlich verschiedene Möglichkeiten zurückzukehren - man kann daten lesen, man kann daten schreiben, auftreten eines fehlers, timeout, signals. Du musst jetzt also herausfinden, in welchem Fall es wann zurückkehren soll, und diesen Fall entsprechend dem select() Aufruf vermitteln.
Dann eben irgendein anderes Signal schicken. select wird genau wie jeder andere System Call durch Signale unterbrochen und kehrt dann mit errno=EAGAIN zurück.
Danke, das mit dem Signal hat funktioniert. Trotzdem wäre es nett gewesen, bei close() auch aufzuwachen (worauf will er noch warten?)
Dr. Sommer schrieb: > Wie schaffst du es, close() aufzurufen, während select() läuft? es soll soetwas geheimes wie threads auch unter linux schon geben.
Peter II schrieb: > es soll soetwas geheimes wie threads auch unter linux schon geben. Ah, von einem anderen Thread aus, das ist doch schonmal eine sinnvolle Information. Er könnte seinen fd zu den exceptfds vom select() hinzufügen, dann müsste select() beim schließen der datei zurückkehren. Oder er macht ein Pipe, in das er vom 2. Thread schreibt, und das er auch dem select() Aufruf übergibt.
Peter II schrieb: > Dr. Sommer schrieb: >> Wie schaffst du es, close() aufzurufen, während select() läuft? > > es soll soetwas geheimes wie threads auch unter linux schon geben. Das ist unter Linux böse! Wenn ein Thread im select() steht und ein andere ein close() aufruft dann wacht ersterer nicht auf und der Socket wird auch noch nicht geschlossen (erst wenn select aus anderen Gründen beendet). Abgesehen davon, das es Nonsens ist sowas überhaupt so zu implementieren - Denn je nachdem ob select() oder close() zuerst aufgerufen wird passiert was völlig anderes. Zum Thema: Wenn die andere Seite des Sockets geschlossen wird, dann wacht select sehr wohl auf - ein EOF auf einem Socket lässt select() nie blockieren. Will man das selbe Programm aus dem select aufwecken dann geht das nur über Signale. (Oder man mach eine Fifo auf, die man ebenfalls im select mit überwacht, die kann man dann vom einem beliebigen Thread aus befüllen)
Nur noch der Netzwerkprozeß läuft im Haupt-Thread, alles andere konnte dank C++11 sehr schön in nebenläufigen Prozessen untergebracht werden. Diese können dank der "condition variables" schnell und unkompliziert aus dem Schlaf gerissen werden.... was man über den Hauptprozess leider nicht sagen kann. http://en.cppreference.com/w/cpp/thread
aber warum werden dem quasi unterm Hintern weg die Sockets geschlossen, auf die er wartet?
Am einfachsten ist wohl ein socketpair() zu erstellen und im select() call mit einzubeziehen. Beim beenden einfach am anderen Ende etwas reinschreiben und select beendet sich. (Wird auch gerne verwendet um sauber Signale zu verarbeiten: Signal-Handler schreibt in den socket; Verarbeitung findet im Haupt-Thread statt.) Nils
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.