Unix / Linux: hur man skapar Zombie Process

mål: analysera hur zombie processer eller nedlagda processer skapas och hur man tar bort dem från processtabellen.

en zombieprocess eller nedlagd process är en process som har slutfört körningen men fortfarande har en post i processtabellen. Detta inträffar för underordnade processer som har gafflats av en överordnad process med hjälp av systemanropet fork() men inte skördats av överordnad process med hjälp av systemanropet wait().

den överordnade processen måste ringa ett wait() (eller waitpid()) systemanrop för att få utgångsstatus för barnprocessen när barnprocessen har avslutats. Om wait() – samtalet inte utförs av föräldraprocessen blir barnprocessen en zombieprocess.

en SIGCHLD – signal skickas till moderprocessen när en barnprocess avslutas. Den överordnade processen måste ha en signalhanteringsfunktion SIGCHLD definierad med ett samtal till wait() – detta tar bort barnprocessen från processtabellen.

för att ta bort zombieprocesser från ett system kan SIGCHLD – signalen skickas till föräldern manuellt med kommandot kill. Om föräldraprocessen fortfarande vägrar att skörda zombieprocessen, och om föräldraprocessen kan dödas, är nästa steg att döda föräldraprocessen. När en barnprocess förlorar sin förälderprocess blir init (PID 1) sin nya förälder. init utför periodiskt wait() systemanrop för att skörda zombieprocesser med init som förälder.

jag skrev ett enkelt C-program för att skapa en zombieprocess.

zombie.c-skapa en zombieprocess

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

#inkludera < stdio.h>
#inkludera < stdlib.h>
#inkludera <sys / typer.h>
#inkludera <sys / vänta.h>
#inkludera <unistd.h>
#inkludera < errno.h>
int Huvud ()
{
pid_t child_pid;
int child_status;
child_pid = gaffel ();
om (child_pid > 0) {
// föräldraprocessen kommer att sova i 30 sekunder och avsluta, utan ett samtal att vänta()
fprintf (stderr,”föräldraprocess – %d \ n”, getpid());
sömn(30);
avsluta(0);
}
annars om (child_pid == 0) {
// barnprocessen avslutas omedelbart
fprintf (stderr,”barnprocess – %d \ n”, getpid());
avsluta(0);
}
annars om (child_pid == -1) {
// gaffel () fel
perror (”gaffel () samtal misslyckades”);
avsluta (-1);
}
annars {
// detta bör inte hända
fprintf(stderr, ”okänt returvärde för % d från gaffel () samtal”, child_pid);
avsluta (-2);
}
tillbaka 0;
}

spara ovanstående kod som zombie.c och kompilera den med gcc.

$ gcc zombie.c -o zombie

kör sedan programmet.

$ ./zombie parent process - 26570child process - 26571

från en annan terminal, gör en ps för att visa processer som körs. Du kommer att se en zombieprocess.

$ 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>

när den överordnade processen har avslutats (efter 30 sekunder) kommer zombieprocessen att tas bort från processtabellen med init – processen.

Mohamed Ibrahim

ibrahim = { interested_in(unix, linux, android, open_source, reverse_engineering); kodning(c, skal, php, python, java, javascript, nodejs, reagera); plays_on (xbox, ps4); linux_desktop_user (true);}

Write a Comment

Din e-postadress kommer inte publiceras.