You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

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.

#include < sys/types.h >
#include < unistd.h >
int glob = 6; /\* external variable in initialized data \*/
char buf\[\] = "a write to stdout\n";
int
main(void)
< 0)perror("fork error");else if (pid == 0){ /* child */ glob++; /* modify variables */ var++; " >{ int var; /\* automatic variable on the stack \*/ pid_t pid; var = 88; if (write(STDOUT_FILENO, buf, sizeof(buf)-1) \!= sizeof(buf)-1) perror("write error"); printf("before fork\n"); /\* we don't flush stdout \*/ if ( (pid = fork()) < 0) perror("fork error"); else if (pid == 0) { /\* child \*/ glob++; /\* modify variables \*/ var++; }
else
sleep(2); /\* parent \*/
printf("pid=%d,glob=%d,var=%d\n",getpid(), glob, var);
exit(0);
}

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ää.
          Lapsi perii äidiltä kaikki avoimet tiedostokuvaajat. Sekä äiti että lapsi käyttävät yhteistä avoimet tiedostot taulun alkiota niillä on yhteinen luku / kirjoituspositio.
  • No labels
You must log in to comment.