Milline signaal: SIGTERM või SIGKILL võib põhjustada zombiprotsesse?
sobes.tech AI
Vastus AI-lt
SIGTERM ei saa otseselt tekitada zombiprotsesse. See saadab teavituse protsessile, et see peaks õigesti lõpetama, andes talle võimaluse vabastada ressursid. Kui protsess ignoreerib SIGTERM-i, see ei lõpe:
SIGKILL ei saa tekitada zombiprotsesse. See tapab protsessi kohe, andmata talle võimalust õigesti lõpetada või luua tütarprotsesse.
Zombi-protsess tekib, kui tütarprotsess lõpeb, kuid tema vanem ei kutsu välja wait() või waitpid(), et koguda lõpetamise staatust. Vanem on vastutav lõpetatud tütarprotsesside staatuse kogumise eest. Sõltumata sellest, kuidas tütarprotsess lõppes (SIGTERM-i, SIGKILL-i või muu põhjusena), muutub see zombi, kuni vanem selle "kogub" või ise lõpetab.
Seega tekitab vanem, kes ei töödelda oma tütarprotsesside lõpetamist, olenemata signaalist, mis selle põhjustas, zombi:
Näide C keeles, mis näitab zombi loomist:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
pid_t pid = fork(); // Loome tütarprotsessi
if (pid == 0) {
// Tütarprotsessi kood
printf("Tütarprotsess (PID: %d) lõpeb.\n", getpid());
exit(0); // Tütarprotsess lõpeb
} else if (pid > 0) {
// Vanema protsessi kood
printf("Vanem (PID: %d) lõi tütar (PID: %d).\n", getpid(), pid);
// Vanem ei kutsu `wait()` või `waitpid()`, mis tekitab zombi
printf("Vanem magab. Tütar peaks saama zombiks.\n");
sleep(60); // Vanem magab, et tütar saaks lõpetada ja muutuda zombiks
} else {
// Fork viga
perror("Viga `fork()`-is");
return 1;
}
return 0;
}
Selles näites lõpeb tütarprotsess, kuid vanem ei kutsu wait(), mis põhjustab zombi. Kui tütarprotsess tapetakse SIGKILL-iga, muutub see samuti zombiks, kui vanem ei kogunud selle staatust. SIGKILL lihtsalt sunniviisiliselt lõpetab protsessi, kuid selle lõpetamise staatus jääb protsesside tabelisse kuni vanem selle "kogub".