Como sei quando um processo foi morto

0

O código a seguir inicia um longo processo nmap e, em seguida, o programa principal tenta eliminá-lo. Estou executando a partir do shell e também tenho GTOP em execução em outra janela apenas para ver se tudo é bem sucedido.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include <sys/wait.h>

int main()
{
int ret,childpid=0;
ret = fork();
if (ret == 0)
   {
   printf("Here A %d.. \n", ret);
   char *params[5]  = {"nmap","-sS","-A","192.168.0.1/24",0}; //cmd params filled
   childpid = execv( "/usr/bin/nmap" , params);  //parameters for cmd
   printf("\n child exiting (%d) (%d).. \n", childpid,errno); //on successful execution of cmd, this exit never appears
   }
else
   {
   childpid=ret;  
   printf("parent exiting\n");
   if (childpid!=0)
      { 
      printf("child %d about to be killed wait 15 so that htop has time to see it\n",childpid);
      sleep(15);
      kill(childpid, SIGTERM);  
      sleep(2);
      kill(childpid, SIGKILL);
      printf("killed wait 15 HTOP should have time to update\n");
      sleep(15);
      }
   }
return 1;
}

O HTOP vê o nmap iniciando, mas quando eu mato o processo ele ainda aparece no display do HTOP. Quando meu programa principal sai, o HTOP remove o nmap da lista de processos. Estou fazendo algo errado ou interpretando mal o HTOP?

    
por user1231247 06.06.2017 / 10:18

2 respostas

3

Você gerou um processo filho, o matou e não usou wait(2) para isso. O processo agora é um zumbi, andando por seus pais. Quando o processo pai morre, o zumbi se torna órfão, e o init cuida disso. De man 2 wait no Linux:

In the case of a terminated child, performing a wait allows the system to release the resources associated with the child; if a wait is not performed, then the terminated child remains in a "zombie" state (see NOTES below).

E das anotações:

A child that terminates, but has not been waited for becomes a "zombie". The kernel maintains a minimal set of information about the zombie process (PID, termination status, resource usage information) in order to allow the parent to later perform a wait to obtain information about the child. As long as a zombie is not removed from the system via a wait, it will consume a slot in the kernel process table, and if this table fills, it will not be possible to create further processes. If a parent process terminates, then its "zombie" children (if any) are adopted by init(1), (or by the nearest "subreaper" process as defined through the use of the prctl(2) PR_SET_CHILD_SUBREAPER operation); init(1) automatically performs a wait to remove the zombies.

Portanto, wait() para o processo filho, ou ele permanecerá até que o processo pai seja interrompido.

    
por 06.06.2017 / 10:52
0

Acho que encontrei uma solução. Se eu mudar a kill -part da seguinte forma:

      ...
      { 
      printf("child %d about to be killed wait 15 so that htop has time to see it\n",childpid);
      sleep(15);
      kill(childpid, SIGKILL);  
      waitpid(childpid,&ret,WUNTRACED);
      }
   }
return 1;
}

Adicionar esse waitpid parece limpar o processo do HTOP. Se alguém souber alguma ressalva (por que devo usar o SIGKILL em vez do SIGTERM ou devo usar outra coisa além de WUNTRACED?), Por favor, avise-me.

    
por 06.06.2017 / 21:47