Muokataan sivua Fork()
Siirry navigaatioon
Siirry hakuun
Kumoaminen voidaan suorittaa. Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen julkaise alla näkyvät muutokset.
Nykyinen versio | Oma tekstisi | ||
Rivi 1: | Rivi 1: | ||
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=== | ===Paluuarvo=== | ||
Palautusarvo (tyyppiä | Palautusarvo (tyyppiä pid_t) on -1 virheen tapahtuessa, muuten se vastaa lapsiprosessin [[pid|prosessitunnusta]]. Lapsiprosessille palautusarvo näkyy nollana (0x0). | ||
==Käyttö== | ==Käyttö== | ||
Fork on se tapa, jolla uusia prosesseja luodaan | |||
Fork on se tapa, jolla uusia prosesseja luodaan unixeissa. Jos lapsiprosessin pitää suorittaa toista ohjelmaa, se käyttää [[exec]]-kutsua forkin ja mahdollisten siivoustoimien jälkeen. Vaikka prosessin kopioiminen ennen kopion korvaamista toisella saattaa tuntua resurssien haaskaukselta, se ei sitä ole: lapsiprosessin muistiavaruus osoittaa samaa fyysistä muistia, kunnes lapsiprosessi kirjoittaa siihen, eikä käyttämätöntä muistia siis tarvitse kopioida ("Copy-on-Write"). | |||
Fork-kutsun lisäksi on olemassa [[clone]]-kutsu, jolla voi tarkemmin määritellä mitkä resurssit jäävät prosessien yhteisiksi. Tällä kutsulla luodaan [[säie|säikeet]]. | Fork-kutsun lisäksi on olemassa [[clone]]-kutsu, jolla voi tarkemmin määritellä mitkä resurssit jäävät prosessien yhteisiksi. Tällä kutsulla luodaan [[säie|säikeet]]. | ||
=== | === Demostraatio === | ||
Luodaan seuraavanlainen C-ohjelma: | Luodaan seuraavanlainen C-ohjelma: | ||
< | <pre> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <unistd.h> | #include <unistd.h> | ||
int main() { | int main() { | ||
printf("Luodaan taustaprosessi\n"); | printf("Luodaan taustaprosessi\n"); | ||
pid = fork(); | pid_t pid = fork(); | ||
if (pid==0) /* Lapsiprosessille pid näkyy nollana */ | if (pid==0) /* Lapsiprosessille pid näkyy nollana */ | ||
printf("Olen lapsiprosessi\n"); | printf("Olen lapsiprosessi\n"); | ||
Rivi 31: | Rivi 30: | ||
return 0; | return 0; | ||
} | } | ||
</ | </pre> | ||
Tallennetaan koodi tiedostoon <tt>fork.c</tt> ja käännetään se komennolla <tt>[[gcc]] fork.c -o fork</tt>. Nyt ohjelman tuloste olisi seuraavanlainen: | Tallennetaan koodi tiedostoon <tt>fork.c</tt> ja käännetään se komennolla <tt>[[gcc]] fork.c -o fork</tt>. Nyt ohjelman tuloste olisi seuraavanlainen: | ||
<pre> | <pre> | ||
Rivi 44: | Rivi 43: | ||
===[[demoni|Taustaprosessin]] luominen=== | ===[[demoni|Taustaprosessin]] luominen=== | ||
fork-funktion ajavan ohjelman toinen osa jää taustalle ja alkuperäinen ohjelma voidaan sammuttaa. Esimerkkikoodi: | fork-funktion ajavan ohjelman toinen osa jää taustalle ja alkuperäinen ohjelma voidaan sammuttaa. Esimerkkikoodi: | ||
< | <pre> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <unistd.h> | #include <unistd.h> | ||
int main() { | int main() { | ||
printf("Luodaan taustaprosessi\n"); | printf("Luodaan taustaprosessi\n"); | ||
pid = fork(); | pid_t pid = fork(); | ||
if (pid > 0) return 0; /* Isäntäprosessi loppuu */ | if (pid > 0) return 0; /* Isäntäprosessi loppuu */ | ||
Rivi 60: | Rivi 57: | ||
return 0; | return 0; | ||
} | } | ||
</ | </pre> | ||
Tallennetaan koodi tiedostoon <tt>taustaprosessi.c</tt>, käännetään se komennolla <tt>gcc taustaprosessi.c -o taustaprosessi</tt> ja ajetaan se (<tt>./taustaprosessi</tt>). Tuloste on seuraavanlainen: | Tallennetaan koodi tiedostoon <tt>taustaprosessi.c</tt>, käännetään se komennolla <tt>gcc taustaprosessi.c -o taustaprosessi</tt> ja ajetaan se (<tt>./taustaprosessi</tt>). Tuloste on seuraavanlainen: | ||
$ ./taustaprosessi | $ ./taustaprosessi | ||
Rivi 67: | Rivi 64: | ||
Ohjelma siis näyttää sammuvan heti tulostettuaan tekstirivin. Tutkitaanpa asiaa hieman tarkemmin. Aja komento | Ohjelma siis näyttää sammuvan heti tulostettuaan tekstirivin. Tutkitaanpa asiaa hieman tarkemmin. Aja komento | ||
[[ps]] aux | [[grep]] taustaprosessi | [[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 | 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. | ||
[[Luokka:Järjestelmä]] | [[Luokka:Järjestelmä]] | ||