Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-09-13 06:48:39 +0400
committerChristopher Faylor <me@cgf.cx>2000-09-13 06:48:39 +0400
commit6b70b4633c100f707689cbba6a1ddd3e4d15e745 (patch)
treed2fd4d30b39b3095d2bf68dd935ae617f88464a7 /winsup/utils/kill.cc
parent858f5249178e01ca9a2ca375158a8633f20a4f3a (diff)
* kill.cc (main): Change behavior of -f so that it will force the killing of a
cygwin process after waiting 2 tenths of a second for it to terminate. (forcekill): Add an extra argument determining whether to wait for the process to exit.
Diffstat (limited to 'winsup/utils/kill.cc')
-rw-r--r--winsup/utils/kill.cc22
1 files changed, 16 insertions, 6 deletions
diff --git a/winsup/utils/kill.cc b/winsup/utils/kill.cc
index b0b9da515..7a3be9b35 100644
--- a/winsup/utils/kill.cc
+++ b/winsup/utils/kill.cc
@@ -15,10 +15,11 @@ details. */
#include <time.h>
#include <errno.h>
#include <windows.h>
+#include <sys/cygwin.h>
static void usage (void);
static int __stdcall getsig (char *);
-static void __stdcall forcekill (int, int);
+static void __stdcall forcekill (int, int, int);
int
main (int argc, char **argv)
@@ -66,10 +67,15 @@ sig0:
printf ("Sending %s(%d) signal to pid %d\n",
strsignal (sig), sig, pid);
#endif
- if (kill (pid, sig))
+ if (kill (pid, sig) == 0)
+ {
+ if (force)
+ forcekill (pid, sig, 1);
+ }
+ else
{
if (errno == ESRCH && force && sig != 0)
- forcekill (pid, sig);
+ forcekill (pid, sig, 0);
else
{
char buf[1000];
@@ -107,11 +113,15 @@ getsig (char *in_sig)
}
static void __stdcall
-forcekill (int pid, int sig)
+forcekill (int pid, int sig, int wait)
{
- HANDLE h = OpenProcess (PROCESS_TERMINATE, FALSE, (DWORD) pid);
+ external_pinfo *p = (external_pinfo *) cygwin_internal (CW_GETPINFO_FULL, pid);
+ if (!p)
+ return;
+ HANDLE h = OpenProcess (PROCESS_TERMINATE, FALSE, (DWORD) p->pid);
if (!h)
return;
- TerminateProcess (h, sig << 8);
+ if (!wait || WaitForSingleObject (h, 200) != WAIT_OBJECT_0)
+ TerminateProcess (h, sig << 8);
CloseHandle (h);
}