Melyik jel: SIGTERM vagy SIGKILL okozhat zombiprocesszeket?
sobes.tech MI
Válasz az MI-től
A SIGTERM nem közvetlenül zombiprocesszusokat hoz létre. Egy értesítést küld a folyamatnak, hogy helyesen fejezze be, így lehetőséget adva neki az erőforrások felszabadítására. Ha a folyamat figyelmen kívül hagyja a SIGTERM-et, nem fog befejeződni.
A SIGKILL nem hozhat létre zombiprocesszusokat. Azonnal megöli a folyamatot, anélkül, hogy lehetőséget adna neki a helyes befejezésre vagy gyermekfolyamatok létrehozására.
Egy zombiprocesszus akkor keletkezik, amikor egy gyermekfolyamat befejeződik, de a szülőfolyamat nem hívja meg a wait() vagy waitpid() függvényt, hogy összegyűjtse a befejezési állapotát. A szülő felelős a befejezett gyermekfolyamatok állapotának összegyűjtéséért. Függetlenül attól, hogyan ért véget a gyermekfolyamat (SIGTERM, SIGKILL vagy más okból), zombivá válik, amíg a szülő "összegyűjti" vagy maga is befejezi.
Ezért a zombik a szülőfolyamat által keletkeznek, amely nem kezeli a gyermekfolyamatok befejezését, függetlenül attól, milyen jelzés vezetett a gyermek folyamatának végéhez.
Példa C nyelven, amely bemutatja a zombik létrehozását:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
pid_t pid = fork(); // Gyermekfolyamat létrehozása
if (pid == 0) {
// Gyermekfolyamat kódja
printf("Gyermekfolyamat (PID: %d) befejeződik.\n", getpid());
exit(0); // Gyermekfolyamat befejeződik
} else if (pid > 0) {
// Szülőfolyamat kódja
printf("Szülőfolyamat (PID: %d) létrehozta a gyermeket (PID: %d).\n", getpid(), pid);
// A szülő nem hív `wait()` vagy `waitpid()`, zombikat hozva létre
printf("A szülő alszik. A gyermek zombivá válik.\n");
sleep(60); // A szülő alszik, hogy a gyermek befejeződjön és zombivá váljon
} else {
// Hiba a fork során
perror("Hiba a fork során");
return 1;
}
return 0;
}
Ebben a példában a gyermekfolyamat befejeződik, de a szülő nem hív wait()-et, ami zombik kialakulásához vezet. A gyermek befejezése ebben az esetben nem közvetlenül SIGTERM vagy SIGKILL által történt, de az elv ugyanaz: a szülő nem gyűjtötte össze az állapotát.
Ha a gyermeket SIGKILL-lel ölnék meg, akkor is zombivá válna, ha a szülő nem gyűjtötte össze az állapotát. A SIGKILL egyszerűen erőszakosan befejezi a folyamatot, de a befejezési állapota továbbra is a folyamat táblában marad, amíg a szülő nem gyűjti össze.