Eine andere Sache, die mich etwas ärgert ist, daß es immer mal wieder vorkommt, daß wärend des Programmierens ich einen Server-Prozess abschiessen muß. Dann können die ganzen Sockets und auch andere Discreptoren natürlich nicht geschlossen werden. Sicher man kann mit lsof sich anschauen welche Discreptoren noch geöffnet sind aber gibt es auch einen "kill"-Befehl für Discreptoren.
Wie dem auch sei, ich würde es gerne vermeiden diese Sockets offen zu lassen und dann einige Minuten zu warten, bis die wieder frei sind.
Also würde ich das gerne mit Signalhandler arbeiten. Das Problem ist nur, woher bekommt der Signalhandler bescheid über die Discreptoren-Nummer? Ich würde es ungerne mit globalen Variablen machen. Und ich habe heute Vormittag erfahren, daß es da eine Möglichkeit gibt einem Signalhandler mehr als nur die Signalnummer zu übergeben.
Weis da jemand Bescheid?
Vielen Dank
Gruss Christian
Sockets schliessen mit Signalhandler
Sockets schliessen mit Signalhandler
Die größten Kritiker der Elche,
waren früher selber welche.
F.W. Bernstein
waren früher selber welche.
F.W. Bernstein
Hallo Columbus
Ich würde es auch nicht als besonders tragisch empfinden, wenn der eine Socket (du brauchst ja nur den Serversocket) in einer globalen Variable gespeichert werden würde.
Eine andere einfache Möglichkeit: Du schließt in deinem Signal Handler einfach ALLE (nicht nur die offenen) Descriptoren:
Die Socketoption SO_REUSEADDR könntest du auch verwenden, diese wird aber aus Sicherheitsgründen nicht gerne gesehen
Gruß
gms
darüber ist mir leider nichts bekannt. Auf den ersten Blick würde ich es sogar bezweifeln, weil der Prototyp für den Signalhandler nur ein Argument (die Signal Nummer) kennt.Columbus hat geschrieben: Und ich habe heute Vormittag erfahren, daß es da eine Möglichkeit gibt einem Signalhandler mehr als nur die Signalnummer zu übergeben
Ich würde es auch nicht als besonders tragisch empfinden, wenn der eine Socket (du brauchst ja nur den Serversocket) in einer globalen Variable gespeichert werden würde.
Eine andere einfache Möglichkeit: Du schließt in deinem Signal Handler einfach ALLE (nicht nur die offenen) Descriptoren:
Code: Alles auswählen
for (i = 0; i < getdtablesize(); i++) {
close(i);
}
Gruß
gms