ubuntuusers.de

[Shell]Hinterlassene C-Sockets schließen

Status: Ungelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

herakles

Anmeldungsdatum:
6. November 2006

Beiträge: 74

Moin!

Wenn ich Programme in C entwickle, kommt es immer mal wieder zu kleineren Abstürzen während der Testphasen. In solchen Fällen (sei es nun durch ganz böse Speicherzugriffsfehler oder einfach nur durch ein abschießen eines Programms, das nicht mehr reagiert) kann eine Signal-Aktionroutine nicht ablaufen, da das Programm dann eben auf kein Signal mehr gehorcht. Zumindest in manchen Fällen.

Das kann mitunter sehr doof sein, weil man dann neben möglicherweise anderen Dingen, die man ungepflegt im Speicher hinterlässt auch schonmal den einen oder anderen Socket offen lässt. Will man die dann bei einem erneuten Programmablaufsversuch wieder benutzen, sind die "alten" nicht geschlossen und man kann u.U. keine neuen öffnen, bevor ein Timeout abgelaufen ist oder dergleichen Dinge gesehen (ja, ich kenne die socket options, mit denen man auch einen blockierte Adresse wieder benutzen könnte, aber darauf will ich nicht hinaus).

Meine Frage: Gibt es einen Shell-Befehl, der alle möglicherweise noch offenen sockets schließt? Eine Art "fflush()" für sockets, die wie Zombies umhergeistern?

Vielen Dank im Voraus für jeden Tipp!

Herakles

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

herakles schrieb:

Wenn ich Programme in C entwickle, kommt es immer mal wieder zu kleineren Abstürzen während der Testphasen. In solchen Fällen (sei es nun durch ganz böse Speicherzugriffsfehler oder einfach nur durch ein abschießen eines Programms, das nicht mehr reagiert) kann eine Signal-Aktionroutine nicht ablaufen, da das Programm dann eben auf kein Signal mehr gehorcht. Zumindest in manchen Fällen.

Läuft es denn noch oder ist es terminiert?

Das kann mitunter sehr doof sein, weil man dann neben möglicherweise anderen Dingen, die man ungepflegt im Speicher hinterlässt auch schonmal den einen oder anderen Socket offen lässt. Will man die dann bei einem erneuten Programmablaufsversuch wieder benutzen, sind die "alten" nicht geschlossen und man kann u.U. keine neuen öffnen, bevor ein Timeout abgelaufen ist oder dergleichen Dinge gesehen (ja, ich kenne die socket options, mit denen man auch einen blockierte Adresse wieder benutzen könnte, aber darauf will ich nicht hinaus).

Den Mechanismus kannst Du m.E. auch nicht aushebeln, denn das ist Teil der Semantik von TCP/IP. Wenn Du nicht die passenden Optionen beim Öffnen setzt, dann muss so ein Socket unter bestimmten Bedingungen noch offen gehalten werden, damit verspätet eintrudelnde Pakete ordentlich bearbeitet werden können.

Meine Frage: Gibt es einen Shell-Befehl, der alle möglicherweise noch offenen sockets schließt? Eine Art "fflush()" für sockets, die wie Zombies umhergeistern?

Wenn der Prozess terminiert, der sie geöffnet hat und kein Kind mehr existiert, das Sockets noch offen hält, dann werden sie vom Kernel automatisch geschlossen. Du kannst also einfach den Prozess killen.

Ciao

robert

Antworten |