Sockets schliessen mit Signalhandler

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Sockets schliessen mit Signalhandler

Beitrag von Columbus » 23.06.2006 15:44:50

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
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 23.06.2006 21:13:17

Hallo Columbus
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
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.

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);
}
Die Socketoption SO_REUSEADDR könntest du auch verwenden, diese wird aber aus Sicherheitsgründen nicht gerne gesehen

Gruß
gms

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 24.06.2006 12:25:26

getdtablesize() das ist eine gute Idee. Von dieser Funktion wusste ich noch nichts, aber die werde ich jezt wohl immer benutzen 8)

Dank Dir.

Gruss Christian
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

Antworten