2017-06-14 2 views
1

Ich habe einen Destruktor, der aufgerufen werden muss, auch wenn das Programm nicht ordnungsgemäß beendet wird, um sicherzustellen, dass ein externer Prozess abstirbt.Funktion beim Beenden oder Programmende ausführen

Zur Zeit habe ich den destructor registriert durch

std::atexit(killprocess); 
std::at_quick_exit(killprocess); 

jedoch aufgerufen werden, bedeutet dies, dass, wenn das Programm beendet ist, aber nicht beendet der Prozess nicht getötet wird. Gibt es eine Möglichkeit, sicherzustellen, dass entweder der Kill-Prozess oder der Destruktor entweder beim Beenden aufgerufen wird oder wenn das Programm beendet, aber nicht beendet wird?

Edit: Der beendete, aber nicht abgeschlossene Status stammt vom Visual Studio, der am Ende eine Wartebedingung hinzufügt. Ich glaube, das bedeutet, dass nach dem registrierten Killprocess mit atexit der Prozess Destruktor natürlich nicht von diesem Punkt in der Ausführung aufgerufen wird

+2

Was meinen Sie mit "fertig, aber nicht beendet"? Meinst du die Zeit zwischen "Main" Returns und dem Prozess tatsächlich endet? –

+0

Call KillProcess als die letzte Zeile in Main –

+0

Wenn ich die Frage richtig verstehe [Std :: at_exit] (http://en.cppreference.com/w/cpp/utility/program/atexit) ist tatsächlich tun, was Sie wollen: 'Registriert die Funktion, auf die func zeigt, um bei normalem Programmabbruch aufgerufen zu werden (über std :: exit() oder von der Hauptfunktion zurück)'. –

Antwort

1

Ich denke, dass Sie die falsche Frage stellen. Ihr Ziel ist es, einen Weg zu finden, um sicherzustellen, dass der externe Prozess stirbt, wenn der Elternprozess stirbt. Aber es gibt keine Möglichkeit, dies sicherzustellen, indem man sich auf einen Funktionsaufruf im Elternprozess verlässt. Es besteht immer die Möglichkeit, dass der Elternprozess in einen inkonsistenten Zustand fällt oder andernfalls diese Bereinigungsfunktion nicht aufruft. Es gibt also einige andere Mechanismen, um das gewünschte Verhalten zu erreichen, wie zum Beispiel die Behandlung einiger Arten von Keepalives im Kindprozess. Beispielsweise können Sie eine Pipe aus einem übergeordneten Prozess bereitstellen. Wenn sie aus irgendeinem Grund beendet wird, wird das Pipe-Ende des Elternprozesses automatisch vom System geschlossen, und der untergeordnete Prozess kann herausfinden, dass er beendet werden muss.

1

Exit-Handler registriert durch std :: atexit sollte am normalen Prozessende aufgerufen werden. Wenn dies nicht der Fall ist, müssen Sie sich woanders umsehen. Siehe Dokumentation für std::atexit. Vielleicht möchten Sie auch std::set_terminate Handler setzen. Einige Programmendungen können nicht bearbeitet werden. Wenn Sie also sicher sein wollen, müssen Sie auf eine Art externe Überwachung zurückgreifen. Einige Ideen sind bereits in den Kommentaren.

Verwandte Themen