4 175
muokkausta
p (→[[demoni|taustaprosessin]] luominen: iso alkukirjain) |
(pari toimivaa esimerkkikoodia) |
||
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. | 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ä== | ==Määritelmä== | ||
pid_t fork() | pid_t fork() | ||
=== | ===Paluuarvo=== | ||
palautusarvo pid_t on -1 virheen | palautusarvo pid_t on -1 virheen tapahtuessa, muuten se vastaa lapsiprosessin [[pid|prosessitunnusta]]. Lapsiprosessille palautusarvo näkyy nollana (0x0). | ||
== | ==Käyttö== | ||
=== Demostraatio === | |||
Luodaan seuraavanlainen C-ohjelma: | |||
<pre> | |||
#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; | |||
} | |||
</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: | |||
<pre> | |||
Luodaan taustaprosessi | |||
Olen lapsiprosessi | |||
Terve Linux.fi | |||
Olen isäntäprosessi | |||
Linux.fi | |||
</pre> | |||
Lisäämällä ehtolauseisiin yhden tulostusrivin sijaan vaikkapa silmukassa ajettavaa koodia (esim. <tt>while(1) printf("Lapsiprosessi");</tt>) huomataan, että prosesseja ajetaan vuorotellen. | |||
===[[demoni|Taustaprosessin]] luominen=== | ===[[demoni|Taustaprosessin]] luominen=== | ||
fork-funktion ajavan ohjelman toinen osa jää taustalle, alkuperäinen ohjelma voidaan sammuttaa esim [[exit()]]-kutsulla. | fork-funktion ajavan ohjelman toinen osa jää taustalle, alkuperäinen ohjelma voidaan sammuttaa esim [[exit()]]-kutsulla. Esimerkkikoodi: | ||
<pre> | |||
#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; | |||
} | |||
</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: | |||
$ ./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. | |||
[[Luokka:Järjestelmä]] | [[Luokka:Järjestelmä]] |