diff options
Diffstat (limited to 'tests/to.c')
-rw-r--r-- | tests/to.c | 44 |
1 files changed, 38 insertions, 6 deletions
@@ -1,9 +1,28 @@ +#include <config.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <sys/types.h> #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; + } +} int main (int argc, char **argv) @@ -30,6 +49,9 @@ main (int argc, char **argv) argc -= 2; argv += 2; + signal (SIGALRM, sighan); + signal (SIGCHLD, sighan); + pid = fork (); if (pid == -1) { @@ -45,8 +67,23 @@ main (int argc, char **argv) } alarm (n); - ret = wait (&status); + 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); if (ret != pid) { @@ -67,8 +104,3 @@ main (int argc, char **argv) progname, argv[0], status); return 127; } - - - - - |