doelstelling: analyseer hoe zombie processen of ter ziele gegane processen worden gemaakt en hoe ze uit de procestabel te verwijderen.
een zombie-proces is een proces dat de uitvoering heeft voltooid, maar nog steeds een regel in de procestabel heeft. Dit gebeurt voor dochterprocessen die zijn gevorkt door een ouderproces met behulp van de fork()
systeemaanroep, maar niet zijn geoogst door het ouderproces met behulp van de wait()
systeemaanroep.
het ouderproces moet een systeemaanroep van wait()
(of waitpid()
) uitvoeren om de afsluitstatus van het dochterproces te krijgen zodra het dochterproces is beëindigd. Als de wait()
aanroep niet wordt uitgevoerd door het ouderproces, wordt het dochterproces een zombie-proces.
een SIGCHLD
signaal wordt naar het ouderproces verzonden wanneer een dochterproces wordt beëindigd. Het bovenliggende proces moet een SIGCHLD
signaalhandlerfunctie hebben gedefinieerd met een aanroep naar wait()
– dit zal het dochterproces uit de procestabel verwijderen.
om zombie-processen uit een systeem te verwijderen, kan het signaal SIGCHLD
handmatig naar de ouder worden verzonden met het commando kill
. Als het ouderproces nog steeds weigert om het zombie-proces te oogsten, en als het ouderproces kan worden gedood, is de volgende stap om het ouderproces te doden. Wanneer een dochterproces zijn ouderproces verliest, wordt init
(PID 1) zijn nieuwe ouder. init
voert periodiek de wait()
systeemaanroep uit om zombieprocessen te oogsten met init
als ouder.
Ik heb een eenvoudig C programma geschreven om een zombie proces aan te maken.
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
|
#inclusief <stdio.h>
#inclusief <stdlib.h>
#inclusief <sys / types.h>
#inclusief <sys / wait.h>
#inclusief <unistd.h>
#inclusief <errno.h>
int main ()
{
pid_t child_pid;
int child_status;
child_pid = fork ();
als (child_pid > 0) {
// het bovenliggende proces zal slapen gedurende 30 seconden in-en uitstappen, zonder een oproep te wachten()
fprintf(stderr,”bovenliggende proces – %d\n”, getpid());
slapen(30);
afsluiten(0);
}
else if (child_pid == 0) {
// kind proces onmiddellijk te verlaten
fprintf(stderr,”kind-proces – %d\n”, getpid());
afsluiten(0);
}
else if (child_pid == -1) {
// fork() fout
perror(“fork() oproep is mislukt”);
exit (-1);
}
else {
/ / dit zou niet moeten gebeuren
fprintf (stderr, “unknown return value of %d from fork () call”, child_pid);
exit (-2);
}
return 0;
}
|
bewaar bovenstaande code als zombie.c
en compileer deze met gcc
.
$ gcc zombie.c -o zombie
voer vervolgens het programma uit.
$ ./zombie parent process - 26570child process - 26571
vanaf een andere terminal, voer een ps
uit om lopende processen weer te geven. U zult een zombie proces te zien.
$ 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>
zodra het bovenliggende proces is beëindigd (na 30 seconden), zal het zombie-proces uit de procestabel worden verwijderd door het init
– proces.
Mohamed Ibrahim
ibrahim = {interested_in (unix, linux, android, open_source, reverse_engineering); coding(C, shell, php, python, java, javascript, nodejs, react); plays_on(xbox, ps4); linux_desktop_user(true); }