summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2007-05-16 13:10:45 -0400
committerBrad King <brad.king@kitware.com>2007-05-16 13:10:45 -0400
commit01c7db07c3826c05c658a370cd0d42bf3128fcff (patch)
treef2cdcf90c29aa520184dbbec6b5da218c4250281 /Source
parentb384218ec10c18f19bbbc83cc4d5b1ac804debb7 (diff)
downloadcmake-01c7db07c3826c05c658a370cd0d42bf3128fcff.tar.gz
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.
Diffstat (limited to 'Source')
-rw-r--r--Source/kwsys/ProcessUNIX.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/Source/kwsys/ProcessUNIX.c b/Source/kwsys/ProcessUNIX.c
index 9917e507a3..bc24fc6b08 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);
}
/*--------------------------------------------------------------------------*/