diff options
Diffstat (limited to 'tests/to.c')
-rw-r--r-- | tests/to.c | 50 |
1 files changed, 41 insertions, 9 deletions
@@ -1 +1,2 @@ +#include <config.h> #include <stdlib.h> @@ -6,2 +7,20 @@ #include <sys/wait.h> +#include <signal.h> + +int volatile got_sigchld, got_sigalrm; + +void +sighan (int sig) +{ + switch (sig) + { + case SIGCHLD: + got_sigchld = 1; + break; + + case SIGALRM: + got_sigalrm = 1; + break; + } +} @@ -15,3 +34,3 @@ main (int argc, char **argv) int status; - + if (argc < 3) @@ -32,2 +51,5 @@ main (int argc, char **argv) + signal (SIGALRM, sighan); + signal (SIGCHLD, sighan); + pid = fork (); @@ -38,3 +60,3 @@ main (int argc, char **argv) } - + if (pid == 0) @@ -47,4 +69,19 @@ main (int argc, char **argv) alarm (n); + while (1) + { + pause (); + if (got_sigchld) + { + alarm (0); + break; + } + if (got_sigalrm) + { + fprintf (stderr, "%s: timed out\n", progname); + kill (pid, SIGKILL); + exit (127); + } + } + ret = wait (&status); - alarm (0); @@ -58,3 +95,3 @@ main (int argc, char **argv) return WEXITSTATUS (status); - + if (WIFSIGNALED (status)) @@ -69,6 +106 @@ main (int argc, char **argv) } - - - - - |