Applikation beenden mit TerminateProcess

13/05/2008 - 23:59 von Thomas Steinbach | Report spam
Hallo NG,

ich habe ein kleines Programm das mir den Apache startet
und auch wieder beenden soll. Das starten des Apache als
Anwendung (nicht Service) klappt gut, aber ich habe in
der httpd.pid nur den Hauptprocess und kann dann nicht
den Kindprocess des Apache terminieren, da ich dessen
PID nicht kenne...

Wie komme ich an diese "zweite" child-PID?

btw: wenn ich im Taskmanager den Hauptprocess ueber
"End Process Tree" kille, dann wird auch der Childprocess
gekillt.

Wenn ich das ueber TerminateProcess oder auch
TerminateApp vgl.: http://support.microsoft.com/kb/178893
mache, dann bleibt der Childprocess bestehen.

Wie kann ich quasi den ganzen ProcessTree, von dem ich
die PID des Hauptprocess habe, killen?

Ein enumerieren nach dem Image "httpd.exe" waere schlecht,
da dann auch eine eventueller Apache-Service gekillt wuerde/koennte.
Vorausgesetzt der User hat die entsprechenden Rechte...

Thomas
 

Lesen sie die antworten

#1 René König
14/05/2008 - 11:57 | Warnen spam
Thomas Steinbach schrieb:
Wie komme ich an diese "zweite" child-PID?



Vermutlich wirst Du einen SnapShot erstellen müssen
(CreateToolhelp32Snapshot). Wenn Du dann über die Prozesse gehst,
bekommst Du den Parent-Process über PROCESSENTRY32->th32ParentProcessID.

Eine andere Möglichkeit wàre es, dem Process einen Job zuzuordnen, also
per CreateJobObject und AssignProcessToJobObject. Wenn Du dann
TerminateJobObject aufrufst, gehen die Kinder ebenfalls dahin. Die
Child-IDs brauchst Du in diesem Fall erst gar nicht zu kennen.

Für den zweiten Ansatz musst Du beachten, dass Du den Parent-Process
erstmal mit CREATE_SUSPENDED erstellst, dann den Job zuweist und erst
danach mit ResumeThread laufen làsst. Das machst Du, damit der zweite
Process nicht schon gestartet wird, ohne das Du den Job zugewiesen hast.

Allerdings sind beide Vorgehen àußerst brutal. Du solltest zuvor an alle
TopLevel-Windows der betroffenen Prozesse noch ein WM_CLOSE posten, so
es welche gibt. Dadurch haben die Prozesse die Möglichkeit, sich selbst
zu beenden.


Gruß,
René

Ähnliche fragen