Unix / Linux: Hvordan Lage Zombie Process

Mål: Analysere hvordan zombie prosesser eller nedlagte prosesser er opprettet og hvordan du fjerner dem fra prosessen tabellen.

en zombieprosess eller nedlagt prosess er en prosess som har fullført utførelsen, men fortsatt har en oppføring i prosesstabellen. Dette skjer for underordnede prosesser som er delt av en overordnet prosess ved hjelp av systemkallet fork(), men ikke høstet av den overordnede prosessen ved hjelp av systemkallet wait().

foreldreprosessen må foreta et systemkall wait() (eller waitpid()) for å få utgangsstatus for barneprosessen når barneprosessen er avsluttet. Hvis wait() – anropet ikke utføres av foreldreprosessen, blir barneprosessen en zombieprosess.

et SIGCHLD signal sendes til foreldreprosessen når en barneprosess avsluttes. Den overordnede prosessen må ha en signalbehandlingsfunksjon SIGCHLD definert med et kall til wait() – dette vil fjerne den underordnede prosessen fra prosesstabellen.

for å fjerne zombieprosesser fra et system, kan signalet SIGCHLD sendes til forelderen manuelt ved hjelp av kommandoen kill. Hvis foreldreprosessen fortsatt nekter å høste zombieprosessen, og hvis foreldreprosessen kan bli drept, er neste trinn å drepe foreldreprosessen. Når en barneprosess mister sin foreldreprosess, blir init (PID 1) sin nye forelder. init utfører periodisk systemkallet wait() for å høste noen zombieprosesser med init som forelder.

jeg skrev et enkelt C-program for å lage en zombieprosess.

zombie.c-opprette en zombie prosess

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

#inkluder < stdio.h>
#inkluder < stdlib.h>
#inkluder <sys/typer.h>
#inkluder <sys/vent.h>
#inkluder < unistd.h>
#inkluder < errno.h>
int hoved ()
{
pid_t child_pid;
int child_status;
child_pid = gaffel ();
if (child_pid)> 0) {
// foreldreprosessen vil sove i 30 sekunder og avslutte, uten å ringe for å vente()
fprintf (stderr,» foreldreprosess – %d\n», getpid());
søvn(30);
avslutt(0);
}
ellers hvis (child_pid == 0) {
// barneprosessen avsluttes umiddelbart
fprintf (stderr, «barneprosess – %d \ n», getpid());
avslutt(0);
}
ellers hvis (child_pid == -1) {
// gaffel () feil
perror(«gaffel() anrop mislyktes»);
avslutt (-1);
}
else {
/ / dette skal ikke skje
fprintf(stderr, «ukjent returverdi av %d fra gaffel() kall», child_pid);
avslutt (-2);
}
tilbake 0;
}

Lagre koden ovenfor som zombie.c og kompilere den med gcc.

$ gcc zombie.c -o zombie

kjør deretter programmet.

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

fra en annen terminal gjør du en ps for å vise kjørende prosesser. Du vil se en zombie prosess.

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

når den overordnede prosessen er avsluttet (etter 30 sekunder), vil zombie prosessen bli fjernet fra prosessen tabellen av init prosessen.

Mohamed Ibrahim

ibrahim = { interested_in (unix, linux, android, open_source, reverse_engineering); koding(c, shell, php, python, java, javascript, nodejs, reagere); plays_on(xbox, ps4); linux_desktop_user(ekte); }

Write a Comment

Din e-postadresse vil ikke bli publisert.