Killing a Process
You might think that the way to terminate a process is to call the obvious
API call, ::TerminateProcess. Wrong. Bad Move.
When you call ::TerminateProcess, the process stops. No matter what
it is doing, it dies. Instantly. If it has a semaphore locked, or a mutex, or
is in the middle of kernel code, or doing something else important, too bad.
Boom! No more process. Imagine lots of Hollywood special effects with massive
fireballs. Not a nice way to die.
A process should always have a "clean" way to be shut down. If you
have hold of the handle of a process that has a window, you can send it a WM_CLOSE
message via PostMessage to that window. If it is a console app, you should
provide a way for it to shut down, such as detecting EOF on stdin, or
receiving a particular text string. But don't use ::TerminateProcess unless
you are willing to live with potentially serious consequences.