Подтвердить что ты не робот

Как убить дочерний процесс родительским процессом?

Я создаю дочерний процесс, используя fork(). Как родительский процесс может убить дочерний процесс, если дочерний процесс не может завершить его выполнение в течение 30 секунд? Я хочу разрешить дочернему процессу выполнять до 30 секунд. Если это займет более 30 секунд, родительский процесс убьет его. У вас есть идея сделать это?

4b9b3361

Ответ 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() для дочернего процесса, чтобы предотвратить любые затяжные зомби.