From 01c7db07c3826c05c658a370cd0d42bf3128fcff Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 16 May 2007 13:10:45 -0400 Subject: [PATCH] BUG: Do not send both SIGSTOP and SIGKILL when killing a process. The SIGSTOP seems to be able to block the SIGKILL occasionally. Also the SIGKILL is sufficient since the process table entry will still exist until it is reaped with waitpid. --- Source/kwsys/ProcessUNIX.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Source/kwsys/ProcessUNIX.c b/Source/kwsys/ProcessUNIX.c index 9917e507a..bc24fc6b0 100644 --- a/Source/kwsys/ProcessUNIX.c +++ b/Source/kwsys/ProcessUNIX.c @@ -2312,8 +2312,13 @@ static void kwsysProcessKill(pid_t process_id) DIR* procdir; #endif - /* Suspend the process to be sure it will not create more children. */ - kill(process_id, SIGSTOP); + /* Kill the process now to make sure it does not create more + children. Do not reap it yet so we can identify its existing + children. There is a small race condition here. If the child + forks after we begin looking for children below but before it + receives this kill signal we might miss a child. Also we might + not be able to catch up to a fork bomb. */ + kill(process_id, SIGKILL); /* Kill all children if we can find them. */ #if defined(__linux__) || defined(__CYGWIN__) @@ -2401,9 +2406,6 @@ static void kwsysProcessKill(pid_t process_id) } #endif } - - /* Kill the process. */ - kill(process_id, SIGKILL); } /*--------------------------------------------------------------------------*/