Unix / Linux: Hogyan hozzunk létre zombi folyamatot

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.

zombi.C-zombi folyamat létrehozása

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

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

Write a Comment

Az e-mail-címet nem tesszük közzé.