You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Kill also children of the process to be killed via Ctrl+C
When a Win32 process needs to be terminated, the child processes it
spawned off also need to be terminated. This is no issue for MSys2
processes because MSys2 emulates Unix' signal system accurately, both
for the process sending the kill signal and the process receiving it.
Win32 processes do not have such a signal handler, though, instead
MSys2 shuts them down via `TerminateProcess()`.
As `TerminateProcess()` leaves the Win32 process no chance to do
anything, and also does not care about child processes, we have to grow
a different solution. For console processes, it should be enough to call
`GenerateConsoleCtrlEvent()`, but sadly even then this seems to handle
child processes correctly only on Windows 8 but not Windows 7.
So let's identify the tree of processes spawned directly and indirectly
from the process to be killed, and kill them all. To do so, we do not
use the NtQueryInformationProcess() function because 1) it is marked
internal and subject to change at any time of Microsoft's choosing, and
2) it does not even officially report the child/parent relationship (the
pid of the parent process is stored in the `Reserved3` slot of the
`PROCESS_BASIC_INFORMATION` structure).
Instead, we resort to the Toolhelp32 API -- which happily also works on
64-bit Windows -- to enumerate the process tree and reconstruct the
process tree rooted in the process we intend to kill.
This fixes the bug where interrupting `git clone https://...` would send
the spawned-off `git remote-https` process into the background instead of
interrupting it, i.e. the clone would continue and its progress would be
reported mercilessly to the console window without the user being able
to do anything about it (short of firing up the task manager and killing
the appropriate task manually).
Note that this special-handling is only necessary when *MSys* handles
the Ctrl+C event, e.g. when interrupting a process started from within
mintty or any other non-cmd-based terminal emulator. If the process was
started from within `cmd.exe`'s terminal window, child processes are
already killed appropriately upon Ctrl+C.
Signed-off-by: Johannes Schindelin <[email protected]>
0 commit comments