Unix / Linux: Come creare processo Zombie

Obiettivo: Analizzare come vengono creati processi zombie o processi defunti e come rimuoverli dalla tabella dei processi.

Un processo zombie o un processo defunto è un processo che ha completato l’esecuzione ma ha ancora una voce nella tabella dei processi. Ciò si verifica per i processi figlio che sono stati biforcati da un processo padre utilizzando la chiamata di sistema fork() ma non raccolti dal processo padre utilizzando la chiamata di sistema wait().

Il processo padre deve effettuare una chiamata di sistema wait() (o waitpid()) per ottenere lo stato di uscita del processo figlio una volta terminato il processo figlio. Se la chiamata wait() non viene eseguita dal processo padre, il processo figlio diventerà un processo zombie.

Un segnale SIGCHLD viene inviato al processo padre ogni volta che termina un processo figlio. Il processo genitore deve avere una funzione di gestore del segnale SIGCHLD definita con una chiamata a

Per rimuovere i processi zombie da un sistema, il segnale SIGCHLD può essere inviato manualmente al genitore, utilizzando il comando kill. Se il processo genitore si rifiuta ancora di raccogliere il processo zombie, e se il processo genitore può essere ucciso, il passo successivo è quello di uccidere il processo genitore. Quando un processo figlio perde il suo processo padre, init (PID 1) diventa il suo nuovo genitore. init esegue periodicamente la chiamata di sistema wait() per raccogliere eventuali processi zombie con init come genitore.

Ho scritto un semplice programma C per creare un processo zombie.

zombie.c – la creazione di un processo 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

#includere < stdio.h>
#includere < stdlib.h>
#include < sys / types.h>
#includi < sys / wait.h>
#includere < unistd.h>
#includere < errno.h>
int principale ()
{
pid_t child_pid;
int child_status;
child_pid = fork ();
se (child_pid > 0) {
// genitore processo di sospensione per 30 secondi e uscire, senza una chiamata in attesa()
fprintf(stderr,”padre di processo %d\n”, getpid());
il sonno(30);
uscita(0);
}
else if (child_pid == 0) {
// processo figlio per uscire immediatamente
fprintf(stderr,”figlio di processo %d\n”, getpid());
uscita(0);
}
else if (child_pid == -1) {
// fork() errore
perror(“fork() chiamata non riuscita”);
exit (-1);
}
else {
// questo non dovrebbe accadere
fprintf(stderr, “unknown valore di ritorno di %d da fork() chiamata”, child_pid);
esci (-2);
}
ritorno 0;
}

Salvare il codice di cui sopra, come zombie.c e compilare utilizzando gcc.

$ gcc zombie.c -o zombie

Quindi, eseguire il programma.

$ ./zombie parent process - 26570child process - 26571

Da un altro terminale, eseguire un ps per visualizzare i processi in esecuzione. Si vedrà un processo di zombie.

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

Una volta terminato il processo padre (dopo 30 secondi), il processo zombie verrà rimosso dalla tabella dei processi dal processo init.

Mohamed Ibrahim

ibrahim = { interested_in(unix, linux, android, open_source, reverse_engineering); – la codifica(c, shell, php, python, java, javascript, nodejs, reagire); plays_on(xbox, ps4); linux_desktop_user(true); }

Write a Comment

Il tuo indirizzo email non sarà pubblicato.