So überschreiben Sie exit (), z. B. durch Auslösen einer Ausnahme

8

Wir haben eine Bibliothek von Drittanbietern, die ohne Berücksichtigung von Multithreading oder Ausnahmen geschrieben wurde. Unsere Haupt-ausführbare Datei ist Multithread und verwendet Ausnahmen.

Die Drittanbieterbibliothek verwendet exit() , um das Programm für schwerwiegende Probleme (wie "Treiber nicht initialisiert" oder "Datei nicht gefunden") abzubrechen. Das Aufrufen von exit() in einer Multithreadanwendung ist nicht zulässig, da Threads nicht ordnungsgemäß heruntergefahren werden. Außerdem möchte ich wirklich nicht die Hauptanwendung beenden, da es sich um eine Serveranwendung handelt, und in vielen Fällen gibt es proaktive Dinge, die das Hauptprogramm tun kann, um den Fehler zu beheben.

Ich möchte das System, das exit(int status) function zur Verfügung stellt, im Wesentlichen durch meine eigene Funktion ersetzen, dh

%Vor%

und fangen Sie die Ausnahme in meinem Code ab. Es scheint zu funktionieren, aber das ist offensichtlich ein Hack und nicht die Art, wie die Natur exit() verwendet werden soll. Was mache ich falsch, ohne es zu wissen?

editieren

Viele haben vorgeschlagen, dass ich dies in einen separaten Prozess stelle, aber das würde viele Dinge besiegen. Die Bibliothek von Drittanbietern führt eine Datenübertragung mit sehr hoher Geschwindigkeit aus, die im Hauptanwendungsprozess sein muss, da sie sich im selben virtuellen Speicherbereich befindet und malloc nicht verwendet, um Speicher vom FPGA-Coprozessor zuzuweisen, bei dem es sich um einen Controller handelt. Dieser Code liegt nahe am "Eisen" und drückt jedes Bit Bandbreite aus dem Speicher und PCIe-Bussen.

bearbeite 2

Mein Programm kann immer noch Statuscodes an das Betriebssystem mit dem Rückgabewert von int main() zurückgeben, was nicht letztlich exit() aufruft. Sonst wäre ich in echten Schwierigkeiten.

    
Mark Lakata 31.07.2014, 21:25
quelle

3 Antworten

1

Dies ist nur eine Idee, aber Sie könnten einen ähnlichen Ansatz wie ich verwenden, wenn ich memcpy umbrechen musste, um eine andere Version zu verwenden, werfen Sie einen Blick auf meine Antwort hier .

Sie könnten also einen Ersatz für die Funktion exit() erstellen, die nichts tut oder eine Bereinigung durchführt. Es ist nur eine Idee und ich habe es nicht versucht, aber es könnte Ihnen helfen, Ihr Problem zu lösen.

    
Ortwin Angermeier 31.07.2014 21:46
quelle
1

Das größte und offensichtlichste Risiko ist der Ressourcenverlust. Wenn die Bibliothek denkt, dass ihre Fehlerbehandlungsstrategie aus dem nächsten Fenster heraustauchen soll, besteht immer das Risiko, dass das Auslösen dieser Ausnahme nicht zu einer gut organisierten Freigabe von Speicher- und Systemressourcen führt.

Aber ich bemerke, dass Sie erwähnen, dass es keinen Speicher mit malloc() zuweist, wenn das bedeutet, dass Sie es mit all seinen Ressourcen als Puffer und dergleichen bereitstellen müssen, dann ist es vielleicht durch einen wundersamen Unfall sicher abrollbar!

Wenn das scheitert, kann ich nur vorschlagen, den Lieferanten zu kontaktieren und sie davon zu überzeugen, dass sie sich dem Rest von uns in den 21. Programmierparadigmen anschließen sollten.

PS: Das Auslösen einer Ausnahme aus einem atexit() -Handler führt zur Beendigung von C ++ - Programmen. Das Hinzufügen eines Wurfmanagers ist also keine Option. Es ist auch keine Option, wenn eine andere Bibliothek einen "atexit ()" - Handler nach Ihrem hinzufügt.

    
Persixty 18.05.2015 22:08
quelle
0

Sie können versuchen, atexit() handler mit longjmp zu verlassen. Obwohl das Verhalten nicht definiert ist :) Die andere Möglichkeit besteht darin, lib in einem separaten Prozess auszuführen, der mit einem IPC überbrückt wird. Härter, mühsam, aber sicherer. Oder Sie können versuchen, ein Binärbild zu scannen und alle Aufrufe von exit() zu haken. Ich kenne MS Umleitungen und mhook auf Windows. Obwohl ich Linux leider nicht kenne.

    
Target-san 31.07.2014 21:53
quelle

Tags und Links