logo

fork() v C

Sistemski klic Fork se uporablja za ustvarjanje novega procesa v sistemih Linux in Unix, ki se imenuje otroški proces , ki teče sočasno s procesom, ki izvede klic fork() (nadrejeni proces). Ko je ustvarjen nov podrejeni proces, bosta oba procesa izvedla naslednje navodilo po sistemskem klicu fork().

Podrejeni proces uporablja isti računalnik (števec programov), iste registre CPE in iste odprte datoteke, ki jih uporablja v nadrejenem procesu. Ne sprejema parametrov in vrne celoštevilsko vrednost.



Spodaj so različne vrednosti, ki jih vrne fork().

  • Negativna vrednost : Ustvarjanje podrejenega procesa je bilo neuspešno.
  • Nič : vrnjen na novo ustvarjen podrejeni proces.
  • Pozitivna vrednost : vrnjeno staršu ali klicatelju. Vrednost vsebuje ID procesa novo ustvarjenega podrejenega procesa.

ustvarjanje procesa fork

Opomba: fork() je funkcija, ki temelji na navojih, da dobite pravilen izhod, zaženite program v lokalnem sistemu.



Upoštevajte, da se zgornji programi ne prevajajo v okolju Windows.

Primer fork() v C

C




enum za niz java



#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;> }>

>

>

Izhod

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

Primer 2: Izračunajte, kolikokrat se natisne pozdrav.

C




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

>

>

Izhod

hello hello hello hello hello hello hello hello>

Pojasnilo

Število natisnjenih 'zdravo' je enako številu ustvarjenih procesov. Skupno število procesov = 2n, kjer je n število sistemskih klicev fork. Torej tukaj je n = 3, 23= 8 Vstavimo nekaj imen oznak za tri vrstice:

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>

Skupaj je torej osem procesov (novi podrejeni procesi in en izvirni proces). Če želimo razmerje med procesi predstaviti kot drevesno hierarhijo, bi bilo to naslednje: Glavni proces: P0 Procesi, ki jih ustvari 1. razcep: P1 Procesi, ki jih ustvari 2. razcep: P2, P3 Procesi, ki jih ustvari 3. razcep: P4, P5, P6, P7

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

Primer 3: Predvidite izhod naslednjega programa.

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;> }>

>

>

Izhod

Hello from Parent! Hello from Child!>

Opomba: V zgornji kodi je ustvarjen podrejeni proces. fork() vrne 0 v podrejenem procesu in pozitivno celo število v nadrejenem procesu. Tukaj sta možna dva izhoda, ker se nadrejeni proces in podrejeni proces izvajata sočasno. Zato ne vemo, ali bo OS najprej dal nadzor nadrejenemu ali podrejenemu procesu.

Nadrejeni proces in podrejeni proces izvajata isti program, vendar to ne pomeni, da sta enaka. OS dodeli različne podatke in stanja za ta dva procesa, nadzorni tok teh procesov pa je lahko različen. Oglejte si naslednji primer:

Primer 4: Predvidite izhod naslednjega programa.

C




pretvori char v niz java

#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;> }>

>

>

Izhod

Parent has x = 0 Child has x = 2>

oz

Izhod

Child has x = 2 Parent has x = 0>

Tukaj sprememba globalne spremenljivke v enem procesu ne vpliva na dva druga procesa, ker so podatki/stanje obeh procesov različni. In tudi starš in otrok delujeta hkrati, tako da sta možna dva izhoda.

fork() proti exec()

Sistemski klic fork ustvari nov proces. Nov proces, ki ga ustvari fork(), je kopija trenutnega procesa, razen vrnjene vrednosti. Po drugi strani pa sistemski klic exec() zamenja trenutni proces z novim programom.

pretvorite niz v datum

Težave na osnovi C fork()

1. Proces izvede naslednjo kodo

C




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

>

>

Skupno število ustvarjenih podrejenih procesov je (GATE-CS-2008)

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

Glejte to za rešitev.

2. Razmislite o naslednjem fragmentu kode:

C




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

>

>

Naj sta u, v vrednosti, ki jih natisne nadrejeni proces, x, y pa vrednosti, ki jih natisne podrejeni proces. Kaj od naslednjega je RES? (GATE-CS-2005)

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

Glejte to za rešitev.

3. Predvidite rezultat spodnjega programa.

C




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

>

>

Glejte to za rešitev

Povezani članki :

  • Program C za predstavitev fork() in pipe()
  • Zombie in orphan procesi v C
  • fork() in črno-beli procesi v skupni rabi pomnilnika, ustvarjeni z njim