点击(此处)折叠或打开
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <unistd.h>
-
#include <sys/wait.h>
-
#include <signal.h>
-
-
pid_t child_pid = -1;
-
-
void alarm_handler(int sig) {
-
if (child_pid != -1) {
-
kill(child_pid, SIGTERM);
-
}
-
}
-
-
int isNumber(const char *s)
-
{
-
int i = 0;
-
for ( i = 0 ; i < strlen((const char *)s) ; i++)
-
{
-
if ( !isdigit(s[i]))
-
{
-
return 1;
-
}
-
}
-
return 0;
-
}
-
-
int main(int argc, char *argv[]) {
-
if (argc < 3) {
-
fprintf(stderr, "Usage: %s
, argv[0]);[args...]\n"
-
return 1;
-
} else if ( isNumber(argv[1]) != 0 )
-
{
-
fprintf(stderr, "Usage: %s
, argv[0]);[args...]\n"
-
return 1;
-
}
-
-
-
int timeout = atoi(argv[1]);
-
if (timeout <= 0) {
-
fprintf(stderr, "Timeout must be a positive integer\n");
-
return 1;
-
}
-
-
signal(SIGALRM, alarm_handler);
-
alarm(timeout);
-
-
child_pid = fork();
-
if (child_pid == 0) {
-
// Child process
-
if ( argc < 4 ){
-
argv[3]=NULL;
-
}
-
execvp(argv[2], &argv[2]);
-
perror("execvp");
-
exit(1);
-
} else if (child_pid > 0) {
-
// Parent process
-
int status;
-
waitpid(child_pid, &status, 0);
-
alarm(0); // Cancel the alarm
-
return WIFEXITED(status) ? WEXITSTATUS(status) : 1;
-
} else {
-
perror("fork");
-
return 1;
-
}
- }