logo

fork() C:ssä

Fork-järjestelmäkutsua käytetään uuden prosessin luomiseen Linux- ja Unix-järjestelmissä, jota kutsutaan nimellä lapsiprosessi , joka toimii samanaikaisesti sen prosessin kanssa, joka tekee fork()-kutsun (emoprosessi). Kun uusi aliprosessi on luotu, molemmat prosessit suorittavat seuraavan käskyn fork()-järjestelmäkutsua seuraavan käskyn.

Lapsiprosessi käyttää samaa tietokonetta (ohjelmalaskuria), samoja CPU-rekistereitä ja samoja avoimia tiedostoja, joita käytetään emoprosessissa. Se ei ota parametreja ja palauttaa kokonaisluvun.



Alla on erilaisia ​​arvoja, jotka fork() palauttaa.

  • Negatiivinen arvo : Alatason prosessin luominen epäonnistui.
  • Nolla : Palattu äskettäin luotuun aliprosessiin.
  • Positiivinen arvo : Palautettu vanhemmalle tai soittajalle. Arvo sisältää juuri luodun aliprosessin prosessitunnuksen.

haarukkaprosessin luominen

Huomautus: fork() on ketjutuspohjainen funktio, jonka avulla saat oikean tulosteen suorittamalla ohjelman paikallisessa järjestelmässä.



Huomaa, että yllä olevia ohjelmia ei käännetä Windows-ympäristössä.

Esimerkki fork():sta C:ssä

C




modeemi vs reititin



#include> #include> #include> int> main()> {> > >// make two process which run same> >// program after this instruction> >pid_t p = fork();> >if>(p<0){> >perror>(>'fork fail'>);> >exit>(1);> >}> >printf>(>'Hello world!, process_id(pid) = %d '>,getpid());> >return> 0;> }>

>

>

Lähtö

Hello world!, process_id(pid) = 31 Hello world!, process_id(pid) = 32>

Esimerkki 2: Laske, kuinka monta kertaa hello tulostetaan.

C




#include> #include> #include> int> main()> {> >fork();> >fork();> >fork();> >printf>(>'hello '>);> >return> 0;> }>

>

>

Lähtö

hello hello hello hello hello hello hello hello>

Selitys

'Hei'-tulostuskertojen määrä on yhtä suuri kuin luotujen prosessien lukumäärä. Prosessien kokonaismäärä = 2n, jossa n on haarukkajärjestelmäkutsujen määrä. Joten tässä n = 3, 23= 8 Laitetaan kolmelle riville tarran nimiä:

fork (); // Line 1 fork (); // Line 2 fork (); // Line 3 L1 // There will be 1 child process /  // created by line 1. L2 L2 // There will be 2 child processes /  /  // created by line 2 L3 L3 L3 L3 // There will be 4 child processes // created by line 3>

Prosesseja on siis yhteensä kahdeksan (uudet aliprosessit ja yksi alkuperäinen prosessi). Jos haluamme esittää prosessien välistä suhdetta puuhierarkiana, se olisi seuraava: Pääprosessi: P0 1. haarukan luomat prosessit: P1 2. haaran luomat prosessit: P2, P3 3. haarukan luomat prosessit: P4, P5, P6, P7

 P0 / |  P1 P4 P2 /   P3 P6 P5 / P7>

Esimerkki 3: Ennusta seuraavan ohjelman tulos.

C




#include> #include> #include> #include> void> forkexample()> {> >pid_t p;> >p = fork();> >if>(p<0)> >{> >perror>(>'fork fail'>);> >exit>(1);> >}> >// child process because return value zero> >else> if> ( p == 0)> >printf>(>'Hello from Child! '>);> > >// parent process because return value non-zero.> >else> >printf>(>'Hello from Parent! '>);> }> int> main()> {> >forkexample();> >return> 0;> }>

>

>

Lähtö

Hello from Parent! Hello from Child!>

Huomautus: Yllä olevassa koodissa luodaan lapsiprosessi. fork() palauttaa 0:n aliprosessissa ja positiivisen kokonaisluvun ylätason prosessissa. Tässä kaksi lähtöä ovat mahdollisia, koska pääprosessi ja aliprosessi ovat käynnissä samanaikaisesti. Emme siis tiedä, antaako käyttöjärjestelmä ensin hallinnan emo- vai lapsiprosessille.

Pääprosessi ja lapsiprosessi käyttävät samaa ohjelmaa, mutta se ei tarkoita, että ne olisivat identtisiä. Käyttöjärjestelmä allokoi eri dataa ja tilaa näille kahdelle prosessille, ja näiden prosessien ohjausvirta voi olla erilainen. Katso seuraava esimerkki:

Esimerkki 4: Ennusta seuraavan ohjelman tulos.

C




rohit shetty näyttelijä

#include> #include> #include> #include> > void> forkexample()> {> >int> x = 1;> >pid_t p = fork();> >if>(p<0){> >perror>(>'fork fail'>);> >exit>(1);> >}> >else> if> (p == 0)> >printf>(>'Child has x = %d '>, ++x);> >else> >printf>(>'Parent has x = %d '>, --x);> }> int> main()> {> >forkexample();> >return> 0;> }>

>

>

Lähtö

Parent has x = 0 Child has x = 2>

tai

Lähtö

Child has x = 2 Parent has x = 0>

Tässä globaali muuttujan muutos yhdessä prosessissa ei vaikuta kahteen muuhun prosessiin, koska näiden kahden prosessin data/tila on erilainen. Ja myös vanhempi ja lapsi juoksevat samanaikaisesti, joten kaksi lähtöä on mahdollista.

fork() vs exec()

Haarukkajärjestelmäkutsu luo uuden prosessin. Fork():lla luotu uusi prosessi on kopio nykyisestä prosessista palautettua arvoa lukuun ottamatta. Toisaalta exec()-järjestelmäkutsu korvaa nykyisen prosessin uudella ohjelmalla.

Tehtävät perustuvat C fork()

1. Prosessi suorittaa seuraavan koodin

C




for> (i = 0; i fork();>

>

kääntää merkkijono javassa
>

Luotujen aliprosessien kokonaismäärä on (GATE-CS-2008)

(A) n
(B) 2^n – 1
(C) 2^n
(D) 2^(n+1) – 1

Katso tästä ratkaisu.

2. Harkitse seuraavaa koodinpätkää:

C




if> (fork() == 0) {> >a = a + 5;> >printf>(>'%d, %d '>, a, &a);> }> else> {> >a = a –5;> >printf>(>'%d, %d '>, a, &a);> }>

>

>

Olkoon u, v pääprosessin tulostamia arvoja ja x, y aliprosessin tulostamia arvoja. Mikä seuraavista on TOSI? (GATE-CS-2005)

(A) u = x + 10 ja v = y
(B) u = x + 10 ja v ! = y
(C) u + 10 = x ja v = y
(D) u + 10 = x ja v != y

Katso tästä ratkaisu.

3. Ennusta alla olevan ohjelman tulos.

C




#include> #include> int> main()> > >fork();> >fork() && fork()>

>

>

Katso tästä ratkaisu

selittää tietojen riippumattomuus

Aiheeseen liittyvät artikkelit :

  • C-ohjelma haarukka() ja pipe() esittelyyn
  • Zombie- ja orpoprosessit C:ssä
  • fork() ja sen avulla luodut jaetut mustavalko-prosessit