Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0
Wiki Markup
Prosessi luodaan funktiolla pid_t \*fork(void);

...


Funktio palauttaa kutsuvalle prosessille lapsiprosessin numeron ja lapsiprosessille 0.

...


fork()-kutsun tuloksena syntyy uusi prosessi, joka on 'klooni' äitiprosessista.

...



* yhteinen koodi

...


* samat muuttujien arvot

...


* samat prosessinkuvaajan perustiedot

...


* yhteiset avoimet tiedostot

...



Kummallakin on kuitenkin:

...


* oma data-alue

...


* oma prosessinkuvaaja

...



fork()-kutsun jälkeen ei voi olla varma siitä kumpi prosessi (äiti vai lapsi) jatkaa aiemmin suoritustaan. Jos järjestys tärkeää, on ohjelmoitava itse synkronointi

...


Esim 1.

...


{code
}
#include < sys/types.h >
#include < unistd.h >

int glob = 6;
char buf[] = "teksti stdout virtaan\n";

int main(void)
{
int var=88;
pid_t pid;
if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
perror("kirjoitusvirhe");
printf("ennen fork-funktiota\n");
if ( (pid = fork()) < 0)
perror("fork virhe");
else if (pid == 0)
{ /* lapsiprosessi */ glob++; /* modifioidaan muutujia */ var++; }
else
sleep(2); /* vanhempi */

printf("pid=%d,glob=%d,var=%d\n",getpid(), glob, var);
exit(0);
}


{code}
Lapsiprosessi luodaan, kun:

...


* halutaan suorittaa äiti\- ja lapsiprosessissa erillinen osa samassa tiedostossa olevasta koodista. Esim. verkkosovelluksissa on tavallista, että palvelija luo lapsiprosessin antamaan palvelua ja jää itse odottamaan uusia palvelupyyntöjä.

...


* halutaan suorittaa kokonaan toinen ohjelma. Tällöin fork()-kutsun jälkeen on lapsiprosessissa myös exec()-kutsu, eli se vaihtaa suoritettavaa koodia. Esim. komentotulkit käyttävät tätä menetelmää.

...


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lapsi perii äidiltä kaikki avoimet tiedostokuvaajat. Sekä äiti että lapsi käyttävät yhteistä avoimet tiedostot taulun alkiota niillä on yhteinen luku / kirjoituspositio.