Zombie-prosessi

Linux.fista
Versio hetkellä 18. elokuuta 2016 kello 17.04 – tehnyt Oselotti (keskustelu | muokkaukset) (Ak: Uusi sivu: '''Zombie-prosessi''' on prosessi, joka on lopettanut suorituksen, mutta on yhä prosessitaulussa. Zombie-prosessit ovat ''eläviä kuolleita'', mistä metafora ''wikipedia:fi:Zo...)
(ero) ← Vanhempi versio | Nykyinen versio (ero) | Uudempi versio → (ero)
Siirry navigaatioon Siirry hakuun

Zombie-prosessi on prosessi, joka on lopettanut suorituksen, mutta on yhä prosessitaulussa. Zombie-prosessit ovat eläviä kuolleita, mistä metafora Zombie on alun perin nimeksi annettu.

Prosessin päättyessä sen resurssit vapautetaan muiden prosessien käyttöön. Prosessi kuitenkin säilyy prosessitaulussa, jotta äitiprosessi voi lukea sen paluuarvon wait()-järjestelmäkutsulla. wait()-järjestelmäkutsun yhteydessä prosessin tunnistenumero vapautetaan, jotta se voidaan käyttää myöhemmin uudelleen. Mikäli prosessin vanhempi ei koskaan suorita wait()-järjestelmäkutsua, jää lapsiprosessi roikkumaan järjestelmään ja siitä tulee zombie.

Zombien etsiminen

Zombie-prosesseja voidaan etsiä ps- ja grep-ohjelmien avulla.

$ ps axo user,pid,ppid,command,s | grep -w Z$

Zombien poistaminen

Zombie-prosessia ei voida tappaa, koska se on jo kuollut. Zombie-prosessit voidaan kuitenkin poistaa järjestelmästä lähettämällä niiden äitiprosessille SIGCHLD-signaali.

$ kill -CHLD <vanhemman_PID>

Toisinaan vanhempi ei kuitenkaan suostu kuuntelemaan signaalia, vaan se täytyy kylmästi tappaa. Tässä tapauksessa zombie-prosessi jää orvoksi ja se siirretään init-prosessin (PID 1) lapseksi. init siivoaa säännöllisin väliajoin sen lapsina olevat zombie-prosessit.

Zombien luominen

Zombie-prosesseja voidaan luoda C:llä esimerkiksi näin:

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    pid_t p;
    for (;;) {
        p = fork();
        if (p > 0)
            sleep(1);
        else
            exit(0);
    }
    return 0;
}