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ää. |
...
Lapsi perii äidiltä kaikki avoimet tiedostokuvaajat. Sekä äiti että lapsi käyttävät yhteistä avoimet tiedostot taulun alkiota niillä on yhteinen luku / kirjoituspositio. |