Unix / Linux: como criar Zombie Process

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.

zombie.c – criação de um processo de “zombie”

C

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); }

Write a Comment

O seu endereço de email não será publicado.