2009-08-26 14 views
2

Mein Verständnis ist, dass, wenn Sie eine C++ - Anwendung durch Task-Manager in Windows XP beenden, die Anwendung noch "sauber" zerstört wird - d. H. Der Aufruf-Stack wird aufgelöst und alle relevanten Objektdestruktoren werden aufgerufen. Ich bin mir nicht sicher, ob mein Verständnis hier falsch ist.Ist es möglich, eine C++ - Anwendung unter Windows XP zu beenden, ohne den Call-Stack abzuwickeln?

Ist es möglich, eine solche Anwendung sofort zu beenden, ohne den Stapel abzuwickeln?

Zum Beispiel kann die Anwendung RAII-Muster verwenden, die Ressourcen zerstören oder freigeben, wenn ein Objekt zerstört wird. Wenn der traditionelle "Kill-Prozess" durch den Task-Manager anmutig ist, würde es mir ermöglichen, die Anwendung sofort zu töten, um ein unangemessenes Herunterfahren (z. B. einen Stromausfall) zu testen.

Edit:

Nur um zu klären, war ich nach einem vorhandenen Dienstprogramm oder Programm, das mir, dies zu tun erlauben würde. Ich sollte in der Lage sein, die Lösung für Programme zu verwenden, für die ich den Quellcode nicht habe, was bedeutet, dass eine programmatische Lösung nicht wirklich akzeptabel ist.

Edit:

Nur mehr Kontext, manchmal habe ich mit 3rd-Party-Diensten arbeiten, die sehr aufdringlich sind (zum Beispiel nörgelnden mir jede Stunde neu zu starten). Da ich weiß, dass ich nicht brauche, um neu zu starten, möchte ich den Prozess/Service zu töten, so dass es mich nicht mehr nervt. Leider waren einige der Entwickler von Drittanbietern "schlau" genug, um mich daran zu hindern, dies zu tun, und wenn ich den Prozess über den Task-Manager abbringe, wird das System sofort neu gestartet (ich nehme an, dass RAII dafür verwendet wird).

+0

Ich bezweifle, dass die Respawning der Nag-Dienste RAII verwendet. –

+0

Der NAG-Dienst wird nicht neu gestartet - er wird getötet, aber nach dem Aussterben wird der Computer neu gestartet. – LeopardSkinPillBoxHat

+0

Für mich hört sich das so an, als würde der Nag-Prozess von einem anderen Prozess ausgelöst, und es wartet nur darauf, dass der Nag-Prozess beendet wird, damit er neu starten kann. Haben Sie versucht, mithilfe von Process Explorer festzustellen, ob ein weiterer Prozess von Drittherstellern als übergeordnetes Element des Nag-Prozesses aufgeführt ist? Wenn dies der Fall ist, könntest du vielleicht stattdessen den Elternteil töten (oder zumindest vor dem Töten des Nag-Prozesses aussetzen). –

Antwort

8

Ich glaube, Task-Manager versucht eine "nette" Herunterfahren durch Senden einer WM_CLOSE-Nachricht, und wenn die Anwendung nicht reagiert, wird es getötet.

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

TerminateProcess

zB:

TerminateProcess(GetCurrentProcess(), 1); 

Update:

Diesen Artikel finden können interessant:

Quitting time: exiting a C++ program

Update 2:

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

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

SysInternals hat ein Dienstprogramm pskill genannt:

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

aber ich bin nicht sicher, wie "nett" ist.

Möglicherweise 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)); 
+0

Ich habe die Frage bearbeitet - ich war hinter einem Dienstprogramm/Programm, das * einen anderen * Prozess töten könnte. Eine programmatische Lösung ist nicht wirklich das, wonach ich suche. – LeopardSkinPillBoxHat

+0

Sie können ein anderes Prozesshandle an TerminateProcess übergeben, wenn Sie möchten. – puetzk

+0

Darüber hinaus kann der Task-Manager die ID jedes Prozesses (die PID, die OpenProcess zugeführt werden müsste) anzeigen, indem er Spalten anzeigen und auswählen auswählt. – TheUndeadFish

0

ich die C-Standardbibliothek Methode Ausgang glauben (0); wird genau das tun, brechen Sie das Programm ab, ohne irgendwelche Destruktoren, Deallocators usw. zu rufen.

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

+0

Ich habe die Frage bearbeitet - ich war hinter einem Dienstprogramm/Programm, das einen anderen Prozess töten könnte. Eine programmatische Lösung ist nicht wirklich das, wonach ich suche. – LeopardSkinPillBoxHat

+0

'exit()' wird Destruktoren für Objekte des statischen Speichers aufrufen. Sie möchten 'abort()' aufrufen, um Destruktoraufrufe zu vermeiden. –

+1

_exit() ist die C-Funktion "sterben ohne Aufräumen", nicht exit(). Angesichts der tatsächlichen Frage ist die richtige Antwort TerminateProcess(). – janm

0

Es sieht so aus als ob abort() Ihnen einen anormalen Ausgang geben wird.

ANSI 4.10.4.1 Das Verhalten der Abbruchfunktion in Bezug schließt nicht zum Öffnen von Dateien und temporären Dateien Die Abbruchfunktion, die offen oder vorübergehender Natur ist. Es ist nicht bündig Strom Puffer [source]

und

Abort aktuelle Prozess den Prozess Bricht mit einem anormalen Programmabbruch. Die Funktion generiert das Signal SIGABRT, das standardmäßig zum Beenden des Programms führt und einen fehlgeschlagenen Beendigungsfehlercode an die Hostumgebung zurückgibt. Das Programm wird ohne Ausführung von Destruktoren für Objekte der automatischen oder statischen Speicherdauer und ohne Aufruf einer Atexit-Funktion beendet. Die Funktion kehrt nie zu ihrem Aufrufer zurück. [source]

+0

Ich habe die Frage bearbeitet - ich war hinter einem Dienstprogramm/Programm, das einen anderen Prozess töten könnte. Eine programmatische Lösung ist nicht wirklich das, wonach ich suche. – LeopardSkinPillBoxHat

0

würde ich PSKill versuchen, wie Tim above vorgeschlagen. Ich würde vermuten, dass dies auch scheitern wird. Wenn die Dienste von Drittanbietern es wirklich ernst meinen mit dem Vermeiden von Tod, dann kann die Dienstdefinition auf "Neustart bei Absturz" gesetzt werden. Der andere übliche Ansatz ist, einen anderen Dienst zu haben, der watchdogs das primäre ist. Der primäre Dienst legt normalerweise ein globales Ereignis fest oder verwendet einen anderen Benachrichtigungsmechanismus, den der Überwachungsdienst überwacht. Wenn der primäre Dienst den Watchdog nicht benachrichtigt, startet der Watchdog den Computer neu.

0

Der passend genannte Kill Tool, verfügbar von Microsoft Download. Ist Teil der Windbg-Suite auch.

Der Kill-Werkzeug, kill.exe, beendet einen oder mehrere Prozesse und alle ihre Threads. Dieses Tool funktioniert nur unter Prozesse, die auf dem lokalen Computer ausgeführt werden.

kill /f <process> 

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

0

Die C-Funktion abort() in der Standardbibliothek wird Ihre Anwendung sofort ohne Bereinigung beenden.

C++ definiert eine globale Standardfunktion terminate(). Wenn Sie es aufrufen, wird Ihre Anwendung sofort beendet.

Technisch beenden() 's Verhalten durch die set_terminate Funktion außer Kraft gesetzt werden könnte. Es ruft standardmäßig einen Abbruch auf.

2

Die Standard-Lösung, um Windows, dies zu tun, ohne auf 3rd-Party-Tool zu verlassen, ist taskkill /f zu verwenden:

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

/f bedeutet „Kraft“ hier, und stellt sicher, dass Verfahren bedingungslos beendet und sofort mit keine Abfrage oder Warnung

0

Es gibt Dienstprogramme um das Neustart verbieten kann.

HideToolz macht das zum Beispiel - es ist ein Kontrollkästchen irgendwo vergraben, die Sie fragen wird, wenn etwas Neustart initiiert. Es wird von vielen als Antiviren-Programmen Rootkit entdeckt (was es ist, aber dieses ist angeblich zahme), so könnte es sein probematic auf Systemen laufen Sie nicht die volle Kontrolle über (wenn Antivirus von Domänenrichtlinie vorgeschrieben, usw.)

2

Wenn ich mich nicht schrecklich irre (und ich habe nur ein paar Tests zur Bestätigung durchgeführt), versucht der Task-Manager, Programme auf verschiedene Arten zu schließen, je nachdem, welche Registerkarte Sie verwenden. Wenn Sie die Registerkarte Anwendungen durchlaufen und auf Task beenden klicken, wird versucht, das Programm sauber zu schließen, indem zuerst ein WM_CLOSE gesendet wird. Wenn Sie jedoch die Registerkarte "Prozesse" durchlaufen und auf "Prozess beenden" klicken, wird scheinbar etwas wie TerminateProcess verwendet, was bedeutet, dass kein Stapel abgewickelt wird.

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

Wenn das, was Sie bereits versucht und ihre Software immer noch gelingt, das System irgendwie neu zu starten, dann ist es etwas komplizierter geht. Andere Menschen sind möglicherweise auf dem richtigen Weg, dass es zusätzliche Prozesse gibt.

+0

Danke - Ich habe End Process auf der Registerkarte Prozesse verwendet. – LeopardSkinPillBoxHat