Skip to content

Commit a83f598

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 bee3f4f commit a83f598

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

winsup/utils/kill.cc

Lines changed: 22 additions & 3 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

@@ -171,10 +172,28 @@ forcekill (int pid, int sig, int wait)
171172
return;
172173
}
173174
if (!wait || WaitForSingleObject (h, 200) != WAIT_OBJECT_0)
174-
if (sig && !TerminateProcess (h, sig << 8)
175-
&& WaitForSingleObject (h, 200) != WAIT_OBJECT_0)
176-
fprintf (stderr, "%s: couldn't kill pid %u, %u\n",
175+
{
176+
if (sig == SIGINT || sig == SIGTERM)
177+
{
178+
HANDLE cur = GetCurrentProcess (), h2;
179+
/* duplicate handle with access rights required for exit_process() */
180+
if (DuplicateHandle (cur, h, cur, &h2, PROCESS_CREATE_THREAD |
181+
PROCESS_QUERY_INFORMATION |
182+
PROCESS_VM_OPERATION |
183+
PROCESS_VM_WRITE | PROCESS_VM_READ |
184+
PROCESS_TERMINATE, FALSE, 0))
185+
{
186+
exit_process (h2, 128 + sig);
187+
CloseHandle (h2);
188+
}
189+
else
190+
terminate_process_tree(h, 128 + sig);
191+
}
192+
else if (sig && !TerminateProcess (h, sig << 8)
193+
&& WaitForSingleObject (h, 200) != WAIT_OBJECT_0)
194+
fprintf (stderr, "%s: couldn't kill pid %u, %u\n",
177195
prog_name, (unsigned) dwpid, (unsigned int) GetLastError ());
196+
}
178197
CloseHandle (h);
179198
}
180199

0 commit comments

Comments
 (0)