objetivo: analisar como os processos zumbis ou processos extintos são criados e como removê-los da tabela de processos.
um processo zumbi ou processo extinto é um processo que concluiu a execução, mas ainda tem uma entrada na tabela de processos. Isso ocorre para processos filhos que foram bifurcados por um processo pai usando a chamada do sistema fork()
, mas não colhidos pelo processo pai usando a chamada do sistema wait()
.
o processo pai deve fazer uma chamada de sistema wait()
(ou waitpid()
) para obter o status de saída do processo filho assim que o processo filho for encerrado. Se a chamada wait()
não for executada pelo processo pai, o processo filho se tornará um processo zumbi.
um sinal SIGCHLD
é enviado para o processo pai sempre que um processo filho termina. O processo pai precisa ter uma função de manipulador de sinal SIGCHLD
definida com uma chamada para
para remover processos zumbis de um sistema, o sinal SIGCHLD
pode ser enviado ao Pai manualmente, usando o comando kill
. Se o processo pai ainda se recusar a colher o processo zumbi, e se o processo pai pode ser morto, o próximo passo é matar o processo pai. Quando um processo filho perde seu processo pai, init
(PID 1) se torna seu novo pai. init
executa periodicamente a chamada do sistema wait()
para colher quaisquer processos zumbis com init
como pai.
eu escrevi um programa C simples para criar um processo zumbi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <stdio.h>
#incluir < stdlib.h>
#incluir < sys / tipos.h>
#incluir < sys / wait.h>
#incluir < unistd.h>
#incluir < errno.h>
int main ()
{
pid_t child_pid;
int child_status;
child_pid = fork ();
se (child_pid > 0) {
// processo principal será de suspensão por 30 segundos e sair, sem uma chamada wait()
fprintf(stderr,”pai de processo %d\n”, getpid());
suspensão(30);
saída(0);
}
else if (child_pid == 0) {
// processo filho vai sair imediatamente
fprintf(stderr,”filho de processo %d\n”, getpid());
saída(0);
}
else if (child_pid == -1) {
// fork() erro
perror(“fork() a chamada falhou”);
exit (-1);
}
else {
// isso não deve acontecer
fprintf(stderr, “desconhecido retornar o valor de %d de fork() de chamada”, child_pid);
sair (-2);
}
retorno 0;
}
|
Salve o código acima como zombie.c
e compilá-lo usando gcc
.
$ gcc zombie.c -o zombie
em seguida, execute o programa.
$ ./zombie parent process - 26570child process - 26571
de outro terminal, faça um ps
para exibir os processos em execução. Você verá um processo de zumbi.
$ ps -ef | grep zombieibrahim 26570 22886 0 15:59 pts/2 00:00:00 ./zombieibrahim 26571 26570 0 15:59 pts/2 00:00:00 <defunct>
assim que o processo pai terminar (após 30 segundos), o processo zumbi será removido da tabela de Processos pelo processo init
.
Mohamed Ibrahim
ibrahim = { interested_in(unix, linux, android, open_source, reverse_engineering); programação(c, shell, php, python, java, javascript, nodejs, reagir); plays_on(xbox, ps4); linux_desktop_user(true); }