2016-06-26 7 views
3

Mehr oder weniger das Thema erklärt die Frage. Ich baue eine Webanwendung mit C++ und Wt. Natürlich versuche ich besonders vorsichtig mit Dingen umzugehen, die einen Segfault verursachen können, aber das könnte passieren. Wt erstellt einen separaten Thread für jeden Benutzer, der eine Sitzung öffnet. Meine schlimmste Befürchtung ist, dass ein böswilliger Benutzer einen Fehler findet, der zum Beispiel einen segfault erzeugt, und es ausnutzt, um die ganze Anwendung zum Absturz zu bringen.C++: Wenn ein segfault oder etwas Ähnliches passiert, gibt es eine Möglichkeit, den einzelnen Thread zu beenden, aber die Anwendung am Laufen zu halten?

Das bevorzugte Verhalten wäre stattdessen, dass ich das Signal "fangen" kann (ja, ich weiß, segfault ist keine Ausnahme, deshalb habe ich die Anführungszeichen verwendet), töte den Thread, der es produziert hat, vielleicht, Wenn möglich, befreie den zugewiesenen Speicher und lasse die Anwendung für die anderen Benutzer laufen.

Ist es möglich?

Danke.

+0

Dies könnte helfen: http://stackoverflow.com/questions/2663456/how-to-write-a-signal-handler-to-catch-sigsegv – tkausl

+0

Versuchen Sie nicht einmal, einen Prozess nach einem kritischen (katastrophales) Versagen, lass es früh sterben. Möglicherweise können Sie Ihre Anwendung jedoch in mehrere Prozesse aufteilen, um kritische Fehler lokal zu vermeiden. –

+0

@ DieterLücking: Danke. Ich weiß, das ist weit davon entfernt, eine perfekte Lösung zu sein, aber ich versuche, das gleiche Verhalten zu erreichen, das ich auf PHP-Servern sehe, wo, wenn etwas schief geht, der Benutzer rausgeschmissen wird, aber der Server geht weiter. Es stimmt, dass dies bei PHP-Servern mit Fehlern zu tun scheint, die in C++ "Compiler-Fehler" sind, aber die Idee, dass ein einzelner Benutzer den gesamten Server zum Absturz bringen kann, ärgert mich zu keinem Ende. Soll ich die Anwendung nach Java verschieben, obwohl sie nur für 1/10 erstellt wird? Würde es bei diesem spezifischen Problem helfen? (Es wäre ein Schmerz, nach Java zu ziehen ... aber ich könnte darüber nachdenken, ob es sich lohnt). – DrHell

Antwort

1

Es gibt eine Möglichkeit, dieses Problem zu-Schritt-Seite durch eine session management configuration Option angeben. Daher können Sie jede Sitzung einem separaten Prozess zuweisen, der bei segfault abstürzt, aber andere Sitzungen nicht beeinträchtigt.

Detail Anmerkung: Wt erstellt nicht wirklich einen Thread für jede Sitzung, es verwendet einen Pool von Threads, um die Arbeit zu planen.

+0

Nun, das ist wirklich interessant. Ich werde es mir ansehen. Danke vielmals! – DrHell

1

Ja, es ist möglich, einen Handler für SIGSEGV zu schreiben. Auf diese Weise können Sie festlegen, was passieren wird.

signal(SIGSEGV, sighandler); 

void sighandler(int signum) 

{ 
    printf("Process %d got signal %d\n", getpid(), signum); 
    kill(getpid(), signum); 
} 
+0

Danke für die Idee. Ich habe versucht sowohl mit Raise (SIGSEGV) und Dereferenzierung eines Null-Zeigers. Der Handler wird nur so lange aufgerufen, wie das Signal mit dem Hauptprozess erzeugt wird, beispielsweise in der Hauptfunktion. Wenn ich versuche, dasselbe in einer Funktion zu tun, die von einem Thread aufgerufen wird, wird der Handler ignoriert. Insbesondere hat das Raise überhaupt keinen Effekt, ein Nullerzeiger zu dekrementieren stürzt das Programm ab, ohne den Handler aufzurufen. Vielleicht hängt es damit zusammen: "Nicht definiert: Aufruf dieser Funktion in einem Multithread-Programm verursacht undefiniertes Verhalten." (Quelle: http://www.cplusplus.com/reference/csignal/signal/) – DrHell