célkitűzés: elemezzük, hogyan jönnek létre zombi folyamatok vagy megszűnt folyamatok, és hogyan távolíthatjuk el őket a folyamattáblázatból.
a zombi folyamat vagy megszűnt folyamat olyan folyamat, amely befejezte a végrehajtást, de még mindig van bejegyzése a folyamat táblában. Ez olyan gyermekfolyamatoknál fordul elő, amelyeket a fork()
rendszerhívást használó szülőfolyamat villázott, de a wait()
rendszerhívást használó szülőfolyamat nem aratta le.
a szülőfolyamatnak wait()
(vagy waitpid()
) rendszerhívást kell végrehajtania, hogy megkapja a gyermekfolyamat kilépési állapotát, miután a gyermekfolyamat befejeződött. Ha a wait()
hívást a szülőfolyamat nem hajtja végre, a gyermekfolyamat zombi folyamattá válik.
a SIGCHLD
jelet küld a szülő folyamat, amikor egy gyermek folyamat véget ér. A szülőfolyamatnak rendelkeznie kell egy SIGCHLD
jelkezelő funkcióval, amelyet a wait()
hívással definiálnak – ez eltávolítja a gyermekfolyamatot a folyamattáblából.
a zombi folyamatok eltávolításához a rendszerből a SIGCHLD
jelet manuálisan lehet elküldeni a szülőnek a kill
paranccsal. Ha a szülő folyamat továbbra sem hajlandó kihasználni a zombi folyamatot, és ha a szülő folyamat megölhető, a következő lépés a szülő folyamat megölése. Amikor egy gyermekfolyamat elveszíti a szülőfolyamatát, init
(PID 1) lesz az új szülő. init
periodikusan végrehajtja a wait()
rendszerhívást, hogy a init
– vel rendelkező zombi folyamatokat learassa.
írtam egy egyszerű C programot egy zombi folyamat létrehozására.
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
|
#tartalmazza < stdio.h>
#tartalmazza < stdlib.h>
#tartalmazza < sys/típusok.h>
#tartalmazza < sys / wait.h>
#tartalmazza < unistd.h>
#tartalmazza < errno.h >
int main ()
{
pid_t child_pid;
int child_status;
child_pid = Villa ();
ha (child_pid > 0) {
// a szülőfolyamat 30 másodpercig alszik, majd kilép, várakozási hívás nélkül ()
fprintf (stderr, “szülőfolyamat – %d \ n”, getpid());
alvás(30);
kilépés(0);
}
else if (child_pid == 0) {
// a gyermekfolyamat azonnal kilép
fprintf (stderr, “gyermekfolyamat – %d \ n”, getpid());
kilépés(0);
}
else if (child_pid == -1) {
// fork () hiba
perror (“fork () hívás sikertelen”);
kilépés (-1);
}
else {
/ / ennek nem szabad megtörténnie
fprintf (stderr, “% d ismeretlen visszatérési értéke a fork () hívásból”, child_pid);
kilépés (-2);
}
vissza 0;
}
|
mentsd el a fenti kódot zombie.c
néven, és fordítsd le a gcc
használatával.
$ gcc zombie.c -o zombie
ezután futtassa a programot.
$ ./zombie parent process - 26570child process - 26571
egy másik terminálról végezzen ps
parancsot a futó folyamatok megjelenítéséhez. Látni fogja a zombi folyamatot.
$ 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>
miután a szülő folyamat befejeződött (30 másodperc után), a zombi folyamat eltávolításra kerül a folyamat táblázatból a init
eljárással.
Mohamed Ibrahim
ibrahim = { interested_in (unix, linux, android, open_source, reverse_engineering); kódolás (c, shell, php, python, java, javascript, nodejs, react); plays_on (xbox, ps4); linux_desktop_user (igaz);}