Prosessin suoritus päättyy normaalisti, kun suoritetaan:
    * funktiossa main() funktio return(status)
    * funktio exit(status) tai
    * funktio _exit(status)

exit() kutsuu funktiolla atexit() rekisteröityjä funktioita ja purkaa stdio:n puskurit (vrt. funktio flush()). _exit() hoitelee Unix-spesifiset lopputoimet Prosessin suoritus voi päättyä myös 'epänormaalisti', kun kutsutaan funktiota abort() tai prosessi saa signaalin, johon se ei varautunut tai ei voi varautua. Epänormaaleissa päättymisissä generoi ydin paluuarvon.
Unix-spesifisiin lopputoimiin kuuluu tiedostojen sulkeminen, muistitilan vapauttaminen sekä äitiprosessin signalointi, mutta prosessinkuvaaja jää vielä olemaan ("zombie"). Koska paluuarvon välittäminen äitiprosessille ja laskutustietojen kokoaminen on vielä kesken.
Jos äitiprosessi on päättynyt ennen lapsiprosessia, merkitsee ydin zombien äidiksi prosessin 1 (init). Se kokoaa laskutustiedot ja vapauttaa prosessinkuvaajan.
Kun prosessi päättyy, saa äiti aina signaalin SIGCHLD. Oletusarvo on, että äiti ei välitä tästä signaalista. Äiti voi pysähtyä odottamaan lapsen päättymistä funktioon wait() tai waitpid():

#include < sys/types.h >
#include < sys/wait.h >

pid_t wait(int *status);pid_t waitpid(pid_t pid, int *status, int options);

Palauttaa: päättyneen prosessin pid,
parametrissa statloc on päättyneen lapsen status
Jos lapsiprosessi on jo päättynyt, pääsee äitiprosessi heti jatkamaan. Funktiolla waitpid() voi määrätä odotettavaksi jonkin tietyn prosessin päättymistä, kun taas funktiolla wait() odotetaan minkä tahansa lapsen päättymistä.
    * pid == -1 odota mitä tahansa lapsiprosessia
    * pid > 0 odota lasta, jolla ko. pid
    * pid == 0 odota mitä tahansa äidin kanssa samaan prosessiryhmän kuuluvaa lasta
    * pid < -1 odota prosessiryhmään |pid| kuuluvaa prosessia

  • No labels
You must log in to comment.