Hansı siqnal: SIGTERM və ya SIGKILL, zombi proseslər yarada bilər?
sobes.tech Süni İntellekt
AI-dan cavab
SIGTERM birbaşa zombi prosesləri yarada bilməz. O, prosesə düzgün şəkildə sona çatması üçün bildiriş göndərir və ona resursları təmizləmək şansı verir. Əgər proses SIGTERM-ə ignore edərsə, o, sona çatmayacaq.
SIGKILL birbaşa zombi prosesləri yarada bilməz. O, prosesi dərhal öldürür və ona düzgün şəkildə sona çatmaq və ya uşaq prosesləri yaratmaq imkanı vermir.
Zombi proses, uşaq prosesi sona çatdıqda, lakin onun valideyn prosesi wait() və ya waitpid() funksiyasını çağırmayıb onun sona çatma vəziyyətini toplamışsa, yaranır. Valideyn prosesi, tamamlanan uşaq proseslərinin vəziyyətini toplamadan məsuliyyət daşıyır. Uşaq prosesi necə sona çatmış olursa olsun (SIGTERM, SIGKILL və ya başqa səbəblə), o, valideyn onu "toplamazsa" və ya özü sona çatarsa, zombi olur.
Bu səbəbdən, zombilər valideyn prosesi tərəfindən yaradılır və bu proses, uşaq proseslərinin sona çatmasını idarə etmir, hansı siqnalın uşaq prosesinin sona çatmasına səbəb olduğundan asılı olmayaraq.
Zombi yaratmağı göstərən C nümunəsi:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
pid_t pid = fork(); // Uşaq prosesi yaradılır
if (pid == 0) {
// Uşaq prosesinin kodu
printf("Uşaq prosesi (PID: %d) sona çatır.\n", getpid());
exit(0); // Uşaq prosesi sona çatır
} else if (pid > 0) {
// Valideyn prosesinin kodu
printf("Valideyn prosesi (PID: %d) uşaq yaratdı (PID: %d).\n", getpid(), pid);
// Valideyn `wait()` və ya `waitpid()` çağırmır, bu da zombilərə səbəb olur
printf("Valideyn prosesi yuxuya gedir. Uşaq zombi olmalı.\n");
sleep(60); // Valideyn yuxuya gedir, beləliklə uşaq sona çatıb zombi olur
} else {
// Fork xətası
perror("Fork xətası");
return 1;
}
return 0;
}
Bu nümunədə, uşaq prosesi sona çatır, lakin valideyn wait() çağırmır, bu da zombilərin yaranmasına səbəb olur. Bu halda, uşaq prosesin sona çatması birbaşa SIGTERM və ya SIGKILL ilə olmamış olsa da, prinsip eynidir: valideyn vəziyyəti toplamayıb.
Əgər uşaq SIGKILL ilə öldürülərsə, o da zombie olar, əgər valideyn onun vəziyyətini toplamayıbsa. SIGKILL prosesi zorla sona çatdırır, lakin onun sona çatma vəziyyəti proseslər cədvəlində qalır və valideyn onu toplamadan əvvəl orada qalır.