Forum: PC-Programmierung Aufwachen aus select()


von Ralf (Gast)


Lesenswert?

Welche Möglichkeit gibt es, einen select()-Aufruf, der ohne 
Zeitbegrenzung parameterisiert ist, abzubrechen? Es geht um das 
Programmende.

von Klaus W. (mfgkw)


Lesenswert?

kill -9 ...

von Ralf (Gast)


Lesenswert?

Nachtrag: das Betriebssystem ist Linux, ein Schließen des Dienst-Sockets 
beendet select() leider nicht....

von Ralf (Gast)


Lesenswert?

Nachtrag2: kontrollierte Beendigung, kein Euro-Rettungsmanöver.

von Dr. Sommer (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

Danke, das mit dem Signal hat funktioniert. Trotzdem wäre es nett 
gewesen, bei close() auch aufzuwachen (worauf will er noch warten?)

von Dr. Sommer (Gast)


Lesenswert?

Wie schaffst du es, close() aufzurufen, während select() läuft?

von Peter II (Gast)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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.

von amesser (Gast)


Lesenswert?

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)

von Ralf (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

aber warum werden dem quasi unterm Hintern weg die Sockets geschlossen, 
auf die er wartet?

von Klaus W. (mfgkw)


Lesenswert?

Ich vermute, der Socket auf der Gegenseite (Server?) wird geschlossen.

von Nils (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.