2017-05-26 3 views
0

J'ai un programme c qui exécute un autre processus (script bash) avec fork et execlp. Quand je veux tuer ce processus, il passe à l'état de zombie. Pourquoi est-ce??Fork, execlp et kill. Processus Zombie

Créer un processus:

switch (PID_BackUp= fork()) 
    { 
     case -1: 
      perror("fork"); 
      printf("An error has occurred launching backup.sh script!\n"); 
      break; 

     case 0: 
      execlp("/usr/local/bin/backup.sh", "/usr/local/bin/backup.sh", NULL, NULL, NULL); 
      break; 

     default: 
      printf("backup.sh script launched correctly! PID: %d\n", PID_BackUp); 
      break; 
    } 

Tuer un processus:

if(kill(PID_BackUp,SIGKILL)==-1) 
     fprintf(stderr, "No se ha podido matar el programa: %d\n", PID_BackUp); 
    else 
     printf("\nProceso con identificador %d, se ha abortado\n", PID_BackUp); 

Donc, à ce stade, le processus passe à un état de zombie. Qu'est ce que je fais mal?

Répondre

4

Vous devez appeler waitpid(2) ou un autre appel système en attente (wait4(2) ...) pour éviter d'avoir zombie processes. BTW vous pouvez également gérer le signal SIGCHLD pour être averti quand un processus enfant a terminé (ou a changé d'état).

En général, vous aurez d'abord mieux kill(2) un processus avec SIGTERM (et seulement plus tard, avec SIGKILL) depuis ce processus -Votre backup.sh Script- pourrait gérer correctement (en utilisant trap dans le script builtin shell) le signal (mais ne peut pas SIGKILL être pris, et la sauvegarde pourrait par exemple laisser des fichiers inutiles ou inutiles sur le disque). Voir aussi signal(7) & signal-safety(7)

Lire Advanced Linux Programming (nous ne pouvons pas expliquer ce qui est enseigné par ce livre librement disponible en plusieurs chapitres en quelques paragraphes). BTW, mieux utiliser perror(3) ou strerror(errno) dans les messages en cas d'échec d'un appel système.

+0

Donc, le processus qui utilise fork devrait-il attendre (waitpid) pour le processus fils? J'utilise fork dans mon programme général (plateforme embarquée) donc je ne peux pas continuer à attendre le processus fils (je devrais créer un thread spécifique) –

+0

Oui, à un certain moment, vous devriez attendre ou waitpid. Cependant, en savoir plus sur 'SIGCHLD' –