#include #include #include #include #include int main(int argc, char **argv) { pid_t newpid; long int timeout = 0; char *endptr; int status = 100; int i = 0; if (argc < 2) { fprintf(stderr, "Usage: %s [args...]\n", argv[0]); exit(1); } timeout = strtol (argv[1], &endptr, 10); if (*endptr != '\0') { fprintf(stderr, "ERROR: Failed to parse timeout.\n"); exit(2); } newpid = fork(); if (newpid < 0) { perror("fork"); exit(10); } else if (newpid == 0) { argv += 2; execvp(argv[0], argv); perror("execvp"); exit(11); } while(--timeout >= 0) { for (i = 0; i < 10; ++i) { if (waitpid(newpid, &status, WNOHANG) == newpid) exit(status); usleep(100000); } } fprintf(stderr, "TIMEOUT: Kill process %d\n", newpid); kill(newpid, SIGTERM); waitpid(newpid, &status, 0); return status; }