Я создаю дочерний процесс, используя fork()
. Как родительский процесс может убить дочерний процесс, если дочерний процесс не может завершить его выполнение в течение 30 секунд? Я хочу разрешить дочернему процессу выполнять до 30 секунд. Если это займет более 30 секунд, родительский процесс убьет его. У вас есть идея сделать это?
Как убить дочерний процесс родительским процессом?
Ответ 1
Отправьте ему SIGTERM или SIGKILL:
http://en.wikipedia.org/wiki/SIGKILL
http://en.wikipedia.org/wiki/SIGTERM
SIGTERM вежлив и позволяет очистить процесс до его начала, тогда как SIGKILL - когда он не будет слушать > :)
Пример из оболочки (справочная страница: http://unixhelp.ed.ac.uk/CGI/man-cgi?kill)
kill -9 pid
В C вы можете сделать то же самое, используя системный вызов kill:
kill(pid, SIGKILL);
См. следующую страницу руководства: http://linux.die.net/man/2/kill
Ответ 2
Попробуйте что-то вроде этого:
#include <signal.h>
pid_t child_pid = -1 ; //Global
void kill_child(int sig)
{
kill(child_pid,SIGKILL);
}
int main(int argc, char *argv[])
{
signal(SIGALRM,(void (*)(int))kill_child);
child_pid = fork();
if (child_pid > 0) {
/*PARENT*/
alarm(30);
/*
* Do parent tasks here.
*/
wait(NULL);
}
else if (child_pid == 0){
/*CHILD*/
/*
* Do child tasks here.
*/
}
}
Ответ 3
В родительском процессе fork() возвращает значение ID процесса дочернего процесса. Вещь, которая стоит где-то, когда вам нужно прекратить дочерний процесс. fork() возвращает ноль (0) в дочернем процессе.
Когда вам нужно завершить дочерний процесс, используйте функцию kill (2) с идентификатором процесса, возвращаемым fork(), и сигналом, который вы хотите доставить (например, SIGTERM).
Не забудьте вызвать wait() для дочернего процесса, чтобы предотвратить любые затяжные зомби.