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