Skip to content

Commit 89f6fc3

Browse files
committed
kill: kill Win32 processes more gently
This change is the equivalent to the change to the Ctrl+C handling we just made. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent b1477cb commit 89f6fc3

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

winsup/utils/kill.cc

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ details. */
1717
#include <cygwin/version.h>
1818
#include <getopt.h>
1919
#include <limits.h>
20+
#include <cygwin/exit_process.h>
2021

2122
static char *prog_name;
2223

@@ -186,10 +187,20 @@ forcekill (pid_t pid, DWORD winpid, int sig, int wait)
186187
return;
187188
}
188189
if (!wait || WaitForSingleObject (h, 200) != WAIT_OBJECT_0)
189-
if (sig && !TerminateProcess (h, sig << 8)
190-
&& WaitForSingleObject (h, 200) != WAIT_OBJECT_0)
191-
fprintf (stderr, "%s: couldn't kill pid %u, %u\n",
192-
prog_name, (unsigned int) dwpid, (unsigned int) GetLastError ());
190+
{
191+
HANDLE cur = GetCurrentProcess (), h2;
192+
/* duplicate handle with access rights required for exit_process_tree() */
193+
if (DuplicateHandle (cur, h, cur, &h2, PROCESS_CREATE_THREAD |
194+
PROCESS_QUERY_INFORMATION |
195+
PROCESS_VM_OPERATION |
196+
PROCESS_VM_WRITE | PROCESS_VM_READ |
197+
PROCESS_TERMINATE, FALSE, 0))
198+
{
199+
CloseHandle(h);
200+
h = h2;
201+
}
202+
exit_process_tree (h2, 128 + sig);
203+
}
193204
CloseHandle (h);
194205
}
195206

0 commit comments

Comments
 (0)