From cc631726d3e1609570170564e442bf735b906448 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Sat, 29 Jul 2000 16:26:37 +0000 Subject: * kill.cc (main): Add '-f' option to force termination of a process. (forcekill): New function. * ps.cc (main): Add '-W' option to list Windows pids as well as Cygwin pids. (dummyprocessmodules): New function. (GetModuleFileNameEx95): New function. (init_win): New function. (to_time_t): New function. --- winsup/utils/kill.cc | 62 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 15 deletions(-) (limited to 'winsup/utils/kill.cc') diff --git a/winsup/utils/kill.cc b/winsup/utils/kill.cc index 611887896..a7913e43c 100644 --- a/winsup/utils/kill.cc +++ b/winsup/utils/kill.cc @@ -1,6 +1,6 @@ /* kill.cc - Copyright 1996, 1997, 1998 Cygnus Solutions. + Copyright 1996, 1997, 1998, 1999, 2000 Red Hat, Inc. This file is part of Cygwin. @@ -13,50 +13,72 @@ details. */ #include #include #include +#include +#include static void usage (void); -static int getsig (char *); -int a = _timezone; +static int __stdcall getsig (char *); +static void __stdcall forcekill (int, int); int -main (int ac, char **av) +main (int argc, char **argv) { int sig = SIGTERM; + int force = 0; + int gotsig = 0; - if (ac == 1) + if (argc == 1) usage (); - if (*(++av)[0] == '-') - if (strcmp(*av + 1, "0") != 0) - sig = getsig (*av++ + 1); + while (*(++argv)[0] == '-') + if (strcmp (*argv + 1, "f") == 0) + force = 1; + else if (gotsig) + break; + else if (strcmp(*argv + 1, "0") != 0) + { + sig = getsig (*argv++ + 1); + gotsig = 1; + } else { - av++; + argv++; sig = 0; goto sig0; } if (sig <= 0 || sig > NSIG) { - fprintf (stderr, "kill: unknown signal: %s\n", av[-1]); + fprintf (stderr, "kill: unknown signal: %s\n", argv[-1]); exit (1); } sig0: - while (*av != NULL) + while (*argv != NULL) { char *p; - int pid = strtol (*av, &p, 10); + int pid = strtol (*argv, &p, 10); if (*p != '\0') - fprintf (stderr, "kill: illegal pid: %s\n", *av); + fprintf (stderr, "kill: illegal pid: %s\n", *argv); else { +#if 0 printf ("Sending %s(%d) signal to pid %d\n", strsignal (sig), sig, pid); +#endif if (kill (pid, sig)) - perror ("kill"); + { + if (errno == ESRCH && force && sig != 0) + forcekill (pid, sig); + else + { + char buf[1000]; + sprintf (buf, "kill %d", pid); + perror (buf); + } + } } - av++; + argv++; } return 0; } @@ -83,3 +105,13 @@ getsig (char *in_sig) } return (strtosigno (sig) ?: atoi (in_sig)); } + +static void __stdcall +forcekill (int pid, int sig) +{ + HANDLE h = OpenProcess (PROCESS_TERMINATE, FALSE, (DWORD) pid); + if (!h) + return; + TerminateProcess (h, sig << 8); + CloseHandle (h); +} -- cgit v1.2.3