web-dev-qa-db-fra.com

Comment tuer un processus enfant par le processus parent?

Je crée un processus enfant en utilisant une fork(). Comment le processus parent peut-il tuer le processus enfant si le processus enfant ne peut pas terminer son exécution dans les 30 secondes? Je souhaite autoriser le processus enfant à s'exécuter jusqu'à 30 secondes. Si cela prend plus de 30 secondes, le processus parent le tuera. Avez-vous une idée de faire ça?

22
miraj

Envoyez-lui un SIGTERM ou un SIGKILL:

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

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

SIGTERM est poli et laisse le processus se nettoyer avant de partir, alors que SIGKILL est pour quand il n'écoute pas> :)

Exemple du shell (page de manuel: http://unixhelp.ed.ac.uk/CGI/man-cgi?kill )

tuer -9 pid

En C, vous pouvez faire la même chose en utilisant le kill syscall:

kill(pid, SIGKILL);

Voir la page de manuel suivante: http://linux.die.net/man/2/kill

28
Mikola

Essayez quelque chose comme ceci:

#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.
         */
    }
}
7
Abhijit

Dans le processus parent, la valeur de retour de fork () est l'ID de processus du processus enfant. Remplissez cette valeur quelque part lorsque vous devez mettre fin au processus enfant. fork () renvoie zéro (0) dans le processus enfant.

Lorsque vous devez mettre fin au processus enfant, utilisez la fonction kill (2) avec l'ID de processus renvoyé par fork () et le signal que vous souhaitez délivrer (par exemple SIGTERM).

N'oubliez pas d'appeler wait () sur le processus enfant pour éviter les zombies persistants.

1
jbruni