Как убить дочерний процесс родительским процессом? - PullRequest
22 голосов
/ 28 июня 2011

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

Ответы [ 3 ]

27 голосов
/ 28 июня 2011

Отправить на него SIGTERM или SIGKILL:

http://en.wikipedia.org/wiki/SIGKILL

http://en.wikipedia.org/wiki/SIGTERM

SIGTERM вежлив и позволяет очистить процесс перед его запуском, тогда как SIGKILL предназначен для случаев, когда он не слушает>:)

Пример из оболочки (man-страница: http://unixhelp.ed.ac.uk/CGI/man-cgi?kill)

убить -9 пид

В C вы можете сделать то же самое, используя системный вызов kill:

kill(pid, SIGKILL);

См. Следующую справочную страницу: http://linux.die.net/man/2/kill

7 голосов
/ 28 июня 2011

Попробуйте что-то вроде этого:

#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's tasks here.
         */
        wait(NULL);
    }
    else if (child_pid == 0){
     /*CHILD*/
        /*
         * Do child's tasks here.
         */
    }
}
1 голос
/ 28 июня 2011

В родительском процессе возвращаемое значение fork () - это идентификатор процесса дочернего процесса. Запишите это значение куда-нибудь, когда вам нужно завершить дочерний процесс. fork () возвращает ноль (0) в дочернем процессе.

Когда вам нужно завершить дочерний процесс, используйте функцию kill (2) с идентификатором процесса, возвращенным fork (), и сигналом, который вы хотите доставить (например, SIGTERM).

Не забудьте вызвать wait () для дочернего процесса, чтобы предотвратить появление каких-либо зомби.

...