Я бы хотел убить дочерний процесс, если он превысит лимит времени ожидания, который передается в качестве аргумента программе в секундах.
В этом примере я передал 3 в качестве лимита времени ожидания. Программа здесь /bin/cat
без каких-либо дополнительных аргументов, поэтому она должна зависнуть и SIGALRM
должна быть запущена, но по какой-то причине она не вызывает функцию killChild()
.
void killChild(int sig) {
printf("PID: %d\n", getpid());
kill(getpid(), SIGKILL);
}
int main(int argc, char** argv) {
// Parse timeout arg
int timeout = 0;
if (argv[1] != NULL) {
timeout = atoi(argv[1]);
}
char program[] = "/bin/cat";
// Create child process
pid_t child = fork();
if (child == 0) { // Child
signal(SIGALRM, killChild);
alarm(timeout);
printf("I'm the child %d, my parent is %d\n", getpid(), getppid());
char* av[] = { program, NULL };
execve(program, av, NULL);
} else { // Parent
printf("I'm the parent %d, my child is %d\n", getpid(), child);
wait(NULL);
alarm(0); // Reset alarm if program executes within timeout limit
}
return 0;
}
РЕДАКТИРОВАТЬ: Согласно предложению @ alk, сигнал заменяется, поэтому я могу оставить его в родительском процессе, поэтому я изменил код так, чтобы вызовы alarm()
и signal()
находились за пределами дочернего процесса. блок.
Теперь вызывается обработчик killChild()
, но есть одна проблема в том, что getpid()
в killChild()
ссылается на родительский PID - как передать дочерний PID в killChild()
?
signal(SIGALRM, killChild);
alarm(timeout);
if (child == 0) { // Child
printf("I'm the child %d, my parent is %d\n", getpid(), getppid());
char* av[] = { program, NULL };
execve(program, av, NULL);
} else { // Parent
printf("I'm the parent %d, my child is %d\n", getpid(), child);
wait(NULL);
alarm(0); // Reset alarm if program executes within timeout limit
}