J'ai le code suivant qui crée un fork enfant. Et je veux tuer l'enfant avant qu'il ne termine son exécution chez le parent. comment faire?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int i;
main (int ac, char **av)
{
int pid;
i = 1;
if ((pid = fork()) == 0) {
/* child */
while (1) {
printf ("I m child\n");
sleep (1);
}
}
else {
/* Error */
perror ("fork");
exit (1);
}
sleep (10)
// TODO here: how to add code to kill child??
}
Envoyez un signal.
#include <sys/types.h>
#include <signal.h>
kill(pid, SIGKILL);
/* or */
kill(pid, SIGTERM);
La deuxième forme est préférable, entre autres, si vous gérez vous-même les signaux.
Voir kill appel système. Habituellement, c'est une bonne idée d'utiliser d'abord SIGTERM pour donner au processus la possibilité de mourir avec reconnaissance avant d'utiliser SIGKILL.
[~ # ~] modifier [~ # ~]
Vous avez oublié d'utiliser waitpid pour obtenir l'état de retour de ce processus et empêcher les processus zombies.
UNE NOUVELLE MODIFICATION
Vous pouvez utiliser le code suivant:
kill(pid, SIGTERM);
bool died = false;
for (int loop; !died && loop < 5 /*For example */; ++loop)
{
int status;
pid_t id;
sleep(1);
if (waitpid(pid, &status, WNOHANG) == pid) died = true;
}
if (!died) kill(pid, SIGKILL);
Cela donnera au processus 5 secondes pour mourir gracieusement
Émettez kill(pid, SIGKILL)
depuis le parent.