about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@codesourcery.com>2014-06-30 20:05:34 +0100
committerMaciej W. Rozycki <macro@codesourcery.com>2014-06-30 20:11:56 +0100
commitd7a05d0728924b25c5ece7fa41f79fe4b073d92c (patch)
tree67981d165ed01d2d2301383363b33f9472a34c1a
parent46f1d8a6b54fc7ed7a7047d5d2ed1a0b884de6c0 (diff)
downloadglibc-d7a05d0728924b25c5ece7fa41f79fe4b073d92c.tar.gz
glibc-d7a05d0728924b25c5ece7fa41f79fe4b073d92c.tar.xz
glibc-d7a05d0728924b25c5ece7fa41f79fe4b073d92c.zip
test-skeleton: Kill any child process's offspring
This makes sure any subprocesses created by the program being tested get
killed as well if their parent times out.  Otherwise if they are really
stuck, they may remain there running forever after the test case and
then the whole test suite has completed, until killed by hand.

	* test-skeleton.c (signal_handler): Kill the whole process group
	before killing the child individually.
	(main): Report any failure on `setpgid'.
-rw-r--r--ChangeLog7
-rw-r--r--test-skeleton.c9
2 files changed, 14 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 785baf996b..b2ea30c235 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2014-06-30  Maciej W. Rozycki  <macro@codesourcery.com>
+	    Roland McGrath <roland@hack.frob.com>
+
+	* test-skeleton.c (signal_handler): Kill the whole process group
+	before killing the child individually.
+	(main): Report any failure on `setpgid'.
+
 2014-06-30  Roland McGrath  <roland@hack.frob.com>
 
 	* sysdeps/arm/nptl/tls.h: Rename the multiple inclusion guard
diff --git a/test-skeleton.c b/test-skeleton.c
index 286d1419cf..c1278ca3b2 100644
--- a/test-skeleton.c
+++ b/test-skeleton.c
@@ -17,6 +17,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#include <assert.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
@@ -138,7 +139,10 @@ signal_handler (int sig __attribute__ ((unused)))
   int killed;
   int status;
 
-  /* Send signal.  */
+  assert (pid > 1);
+  /* Kill the whole process group.  */
+  kill (-pid, SIGKILL);
+  /* In case setpgid failed in the child, kill it individually too.  */
   kill (pid, SIGKILL);
 
   /* Wait for it to terminate.  */
@@ -342,7 +346,8 @@ main (int argc, char *argv[])
 
       /* We put the test process in its own pgrp so that if it bogusly
 	 generates any job control signals, they won't hit the whole build.  */
-      setpgid (0, 0);
+      if (setpgid (0, 0) != 0)
+	printf ("Failed to set the process group ID: %m\n");
 
       /* Execute the test function and exit with the return value.   */
       exit (TEST_FUNCTION);