web-dev-qa-db-fra.com

comment tuer enfant de fourchette?

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??

}
13
MOHAMED

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.

11
md5

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

11
Ed Heal

Émettez kill(pid, SIGKILL) depuis le parent.

4
alk