Kura signāls: SIGTERM vai SIGKILL var radīt zombiju procesus?
sobes.tech AI
Atbilde no AI
SIGTERM tieši nevar radīt zombiju procesus. Tas nosūta paziņojumu procesam par nepieciešamību pareizi beigties, dodot tam iespēju atbrīvot resursus. Ja process ignorē SIGTERM, tas nebeidzas:
SIGKILL nevar radīt zombiju procesus. Tas nekavējoties nogalina procesu, nesniedzot tam iespēju pareizi beigties vai radīt bērnu procesus.
Zombiju process rodas, kad bērna process beidzas, bet tā vecāks neizsauc wait() vai waitpid(), lai savāktu beigu stāvokli. Vecāks ir atbildīgs par beigu stāvokļa savākšanu. Neatkarīgi no tā, kā bērna process ir beidzies (ar SIGTERM, SIGKILL vai citādi), tas kļūst par zombiju, kamēr vecāks to "savāc" vai pats beidzas.
Tādēļ zombiju rada vecāks, kurš neapstrādā savus bērnu procesus, neatkarīgi no signāla, kas noveda pie to beigu:
C valodas piemērs, kas demonstrē zombiju radīšanu:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
pid_t pid = fork(); // Izveido bērna procesu
if (pid == 0) {
// Bērna procesa kods
printf("Bērna process (PID: %d) beidzas.\n", getpid());
exit(0); // Bērna process beidzas
} else if (pid > 0) {
// Vecāka procesa kods
printf("Vecāks (PID: %d) izveidoja bērnu (PID: %d).\n", getpid(), pid);
// Vecāks neizsauc `wait()` vai `waitpid()`, radot zombiju
printf("Vecāks guļ. Bērns būtu jāpadara par zombiju.\n");
sleep(60); // Vecāks guļ, lai bērns varētu beigties un kļūt par zombiju
} else {
// Fork kļūda
perror("Kļūda `fork()`");
return 1;
}
return 0;
}
Šajā piemērā bērna process beidzas, bet vecāks neizsauc wait(), kas noved pie zombiju. Ja bērna process tiktu nogalināts ar SIGKILL, tas arī kļūtu par zombiju, ja vecāks neapstrādātu tā statusu. SIGKILL vienkārši piespiedu kārtā pārtrauc procesu, bet tā beigu stāvoklis paliek procesoru tabulā līdz tam, kamēr vecāks to "savāc".