Я хотел бы убить дочерний процесс, если он превышает лимит времени ожидания, который передается в качестве аргумента программе в секундах.
В этом примере я передал 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
}
killChild()
используется как обработчик сигналов - person woz   schedule 21.01.2019execve()
с нулевым указателем для среды не является общепринятым. лучший — я думаю, что это приводит к неопределенному поведению. Однако это не связано с вашей текущей проблемой. - person Jonathan Leffler   schedule 21.01.2019