Gast
#2805497
Welche Möglichkeit gibt es, einen select()-Aufruf, der ohne Zeitbegrenzung parameterisiert ist, abzubrechen? Es geht um das Programmende.
|
Anzeige
|
Aufwachen aus select()
Gast
#2805497
Welche Möglichkeit gibt es, einen select()-Aufruf, der ohne Zeitbegrenzung parameterisiert ist, abzubrechen? Es geht um das Programmende. kill -9 ...
Gast
#2805507
Nachtrag: das Betriebssystem ist Linux, ein Schließen des Dienst-Sockets beendet select() leider nicht....
Gast
#2805512
Nachtrag2: kontrollierte Beendigung, kein Euro-Rettungsmanöver.
Gast
#2805521
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.
Gast
#2805523
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.
Gast
#2805605
Danke, das mit dem Signal hat funktioniert. Trotzdem wäre es nett gewesen, bei close() auch aufzuwachen (worauf will er noch warten?)
Gast
#2805641
Wie schaffst du es, close() aufzurufen, während select() läuft?
Gast
#2805648
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.
Gast
#2805684
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.
Gast
#2805691
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)
Gast
#2805884
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
Gast
#2807754
aber warum werden dem quasi unterm Hintern weg die Sockets geschlossen, auf die er wartet? Ich vermute, der Socket auf der Gegenseite (Server?) wird geschlossen.
Gast
#2807839
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 Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|