Ero sivun ”Fork()” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
Rivi 31: Rivi 31:
Terve Linux.fi
Terve Linux.fi
Olen isäntäprosessi
Olen isäntäprosessi
Linux.fi
Terve Linux.fi
</pre>
</pre>
Lisäämällä ehtolauseisiin yhden tulostusrivin sijaan vaikkapa silmukassa ajettavaa koodia (esim. <tt>while(1) printf("Lapsiprosessi");</tt>) huomataan, että prosesseja ajetaan vuorotellen.
Lisäämällä ehtolauseisiin yhden tulostusrivin sijaan vaikkapa silmukassa ajettavaa koodia (esim. <tt>while(1) printf("Lapsiprosessi");</tt>) huomataan, että prosesseja ajetaan vuorotellen.

Versio 28. marraskuuta 2007 kello 10.29

Fork on SVr4, 4.3BSD ja POSIX.1-2001 -standardienmukainen funktio C:ssä, jolla luodaan ohjelmalle kutsun suorituskohtaan lapsiprosessi vastaavassa tilassa. Funktion esittely löytyy unistd.h-otsikkotiedostosta.

Määritelmä

pid_t fork()

Paluuarvo

Palautusarvo (tyyppiä pid_t) on -1 virheen tapahtuessa, muuten se vastaa lapsiprosessin prosessitunnusta. Lapsiprosessille palautusarvo näkyy nollana (0x0).

Käyttö

Demostraatio

Luodaan seuraavanlainen C-ohjelma:

#include <stdio.h>
#include <unistd.h>

int main() {
        printf("Luodaan taustaprosessi\n");
        pid_t pid = fork();
        if (pid==0)     /* Lapsiprosessille pid näkyy nollana */
                printf("Olen lapsiprosessi\n");

        else if (pid>0)    /* Forkkaus onnistui, tämä on isäntä */
                printf("Olen isäntäprosessi\n");
        printf("Terve Linux.fi\n");
        return 0;
}

Tallennetaan koodi tiedostoon fork.c ja käännetään se komennolla gcc fork.c -o fork. Nyt ohjelman tuloste olisi seuraavanlainen:

Luodaan taustaprosessi
Olen lapsiprosessi
Terve Linux.fi
Olen isäntäprosessi
Terve Linux.fi

Lisäämällä ehtolauseisiin yhden tulostusrivin sijaan vaikkapa silmukassa ajettavaa koodia (esim. while(1) printf("Lapsiprosessi");) huomataan, että prosesseja ajetaan vuorotellen.

Taustaprosessin luominen

fork-funktion ajavan ohjelman toinen osa jää taustalle ja alkuperäinen ohjelma voidaan sammuttaa. Esimerkkikoodi:

#include <stdio.h>
#include <unistd.h>

int main() {
        printf("Luodaan taustaprosessi\n");
        pid_t pid = fork();

        if (pid > 0) return 0;      /* Isäntäprosessi loppuu */
        if (pid < 0) return -1;     /* Forkkaus ei onnistunut 0_o */

        while(1) { }   /* Ikuinen silmukka */
        return 0;
}

Tallennetaan koodi tiedostoon taustaprosessi.c, käännetään se komennolla gcc taustaprosessi.c -o taustaprosessi ja ajetaan se (./taustaprosessi). Tuloste on seuraavanlainen:

$ ./taustaprosessi
Luodaan taustaprosessi
$

Ohjelma siis näyttää sammuvan heti tulostettuaan tekstirivin. Tutkitaanpa asiaa hieman tarkemmin. Aja komento

ps aux | grep taustaprosessi

Jolloin huomaat, että taustaprosessi-niminen ohjelma on yhä ajossa. Myös top:in prosessilistauksessa sen pitäisi näkyä yläpäässä kuluttamassa paljon prosessoritehoa.