Frage

Mein Verständnis ist, dass, wenn Sie eine C ++ Anwendung durch den Task-Manager in Windows XP zu töten, die Anwendung ist noch „sauber“ zerstört - das heißt der Call-Stack wird entspannen und alle relevanten Objekt Destruktoren werden aufgerufen werden. Nicht sicher, ob mein Verständnis ist hier falsch.

Ist es möglich, sofort einen solchen Antrag zu töten, ohne den Stapel Abwickeln?

Zum Beispiel kann die Anwendung RAH-Muster verwenden, die zerstört oder Freigabe-Ressourcen, wenn ein Objekt zerstört wird. Wenn der traditionelle „Kill Prozess“, durch die Task-Manager anmutig ist, eine Möglichkeit, die Bereitstellung die Anwendung zu töten sofort würde mir erlauben, sofortiges Ausschalten zu testen (zum Beispiel eines Stromausfall).

Edit:

Nur um zu klären, war ich nach einem vorhandenen Dienstprogramm oder Programm, das mir, dies zu tun erlauben würde. Ich sollte die Lösung auf Programme nutzen können, dass ich nicht den Quellcode, was bedeutet, dass eine programmatische Lösung nicht wirklich akzeptabel ist.

Edit:

Nur mehr Kontext, manchmal ich an die Arbeit mit 3rd-Party-Dienste haben, die sehr aufdringlich sind (z nagende mich jede Stunde neu zu starten). Da ich weiß, dass ich nicht Notwendigkeit Neustart, ich möchte den Prozess / Dienst töten, damit es mich nicht mehr nerven. Leider waren einige des 3rd-Party-Entwicklers „smart“ genug, um mich zu verhindern, dass dies zu tun, und wenn ich den Prozess durch die Task-Manager zu töten, wird das System neu gestartet sofort (ich vermute, dass RAII verwenden, dies zu erreichen).

War es hilfreich?

Lösung

Ich glaube, Task-Manager ein „nettes“ shutdown versucht, durch eine WM_CLOSE Nachricht sendet, dann, wenn die Anwendung nicht reagiert sie getötet hat.

Dieser Aufruf sollte den Prozess sofort ohne Warnung töten:

TerminateProcess

z.

TerminateProcess(GetCurrentProcess(), 1);

Update:

Sie können diesen Artikel interessant finden:

Kündigen Zeit: Verlassen eines C ++ Programm

Update 2:

  

Ich sollte die Lösung auf Programme nutzen können, dass ich nicht den Quellcode für

Hmm, auch dies ist ein unerwünschtes Verhalten 99,9% der Zeit.

SysInternals hat ein Programm namens pskill:

http://technet.microsoft.com/en-us/sysinternals/ bb896683.aspx

, aber ich bin nicht sicher, wie „nett“ ist.

Unter Umständen müssen Sie Ihre eigene Rolle, aber es sollte ziemlich einfach sein:

DWORD pid = <get pid from command line>;

TerminateProcess(OpenProcess(PROCESS_TERMINATE, FALSE, pid));

Andere Tipps

Der Standard-Windows-Weg, dies zu tun, ohne sie auf 3rd-Party-Tool, ist taskkill /f zu verwenden:

taskkill /f <process-id>
taskkill /f /im <process-executable-name> 

/f bedeutet „Kraft“ hier, und stellt sicher, dass der Prozess beendet ist bedingungslos und sofort, ohne Abfrage oder Warnung.

Wenn ich schrecklich irre (und ich habe nur ein wenig Tests zu bestätigen), versucht, den Task-Manager zu schließen Programme auf unterschiedliche Weise je nachdem, welche Registerkarte Sie verwenden. Wenn die Registerkarte Anwendungen durchlaufen und Task beenden drückt, wird es versuchen, das Programm sauber zu schließen, indem zuerst ein WM_CLOSE senden. Aber wenn durch die Registerkarte Prozesse geht und Prozess beenden drücken, so scheint es etwas entlang der Linien von TerminateProcess zu verwenden, was bedeutet, dass kein Stapel Abwickeln und so weiter.

So zuerst, wenn Sie nicht auf Prozess beenden verwenden auf der Registerkarte Prozesse versuchen.

Wenn das, was Sie bereits versucht und ihre Software immer noch gelingt, das System irgendwie neu zu starten, dann ist es etwas kompliziert geht. Andere Leute auf dem richtigen Weg sein können, um dort zusätzliche Prozesse zu sein.

Ich glaube, dass die C-Standardbibliothek Methode exit (0);. wird genau das tun, Abbruch des Programms ohne Destruktoren aufrufen, deallocators, etc

Versuchen Sie das mal, und lassen Sie mich wissen, ob es Ihren Bedürfnissen entspricht?

Es sieht aus wie abort () gibt Ihnen einen anormalen Ausgang.

  

ANSI 4.10.4.1 Das Verhalten der Abbruchfunktion im Hinblick auf offene und temporären Dateien   Die Abbruchfunktion schließt nicht Dateien, die offen oder temporär sind. Es ist nicht Spülstroms   Puffer    [Quelle]

und

  

Abbruch aktuelle Prozess   Bricht den Prozess mit einem Unerwarteter Programmabbruch.   Die Funktion erzeugt das SIGABRT Signal, das standardmäßig bewirkt, daß das Programm beenden> einen nicht erfolgreichen Beendigungsfehlercode an die Host-Umgebung zurückkehrt.   Das Programm wird beendet, ohne Destruktoren für Objekte von automatischen oder statischer Ausführung   Lagerdauer und ohne jede atexit Funktion aufrufen.   Die Funktion gibt nie an seinen Aufrufer.    [Quelle]

Ich würde versuchen, PsKill wie von Tim oben . Ich würde vermuten, dass dies auch fehlschlagen. Wenn die 3rd-Party-Dienste wirklich ernsthaft über den Tod zu vermeiden, kann die Service-Definition auf „Neustart auf Crash“ gesetzt werden. Der andere gemeinsame Ansatz ist einen anderen Dienst zu haben, dass Aufpasser die primären. Der primäre Dienst setzt in der Regel ein globales Ereignis oder beschäftigt einen anderen Benachrichtigungsmechanismus, dass der Watchdog-Dienst Uhren. Wenn der primäre Dienst nicht den Watchdog benachrichtigen, dann wird der Watchdog startet den Computer neu.

Die passenden Namen Kill Tool von Microsoft Download zur Verfügung. Ist Teil der Windbg Suite auch.

  

Die Kill-Werkzeug, kill.exe, beendet   einen oder mehrere Prozesse und alle ihre   Threads. Dieses Tool funktioniert nur auf   Prozesse auf dem lokalen Lauf   Computer.

kill /f <process>

Zum Beispiel kill /f lsass (nur Scherz, tut nicht Kill LSA!). Wenn Sie Ihre eigene Rolle möchten, TerminateProcess ist der Weg zu gehen.

Die C-Funktion abbrechen () in der Standardbibliothek wird Ihre Anwendung ohne Bereinigung sofort töten.

C ++ definiert eine Standard globale Funktion beenden (). Der Aufruf verlassen wird es auch sofort Ihre Bewerbung.

Technisch beenden () 's Verhalten durch die set_terminate Funktion außer Kraft gesetzt werden könnte. Er fordert Abbruch standardmäßig aktiviert.

Es gibt Dienstprogramme um das kann Neustart verbieten.

HideToolz macht das zum Beispiel - es gibt eine Checkbox ist begraben irgendwo, dass es Sie, wenn etwas initiiert Neustart fragen machen. Es wird von vielen als Antiviren-Programmen Rootkit entdeckt (was es ist, aber dies ist angeblich zahme), so dass es probematic sein könnte auf Systeme laufen Sie haben nicht die volle Kontrolle über (wenn Antivirus von Domäne-Richtlinie vorgeschrieben, usw.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top