logo

fork() v C

Systémové volanie Fork sa používa na vytvorenie nového procesu v systémoch Linux a Unix, ktorý sa nazýva detský proces , ktorý beží súčasne s procesom, ktorý volá fork() (nadradený proces). Po vytvorení nového podriadeného procesu oba procesy vykonajú ďalšiu inštrukciu po systémovom volaní fork().

Podradený proces používa rovnaký počítač (počítadlo programov), rovnaké registre CPU a rovnaké otvorené súbory, ktoré sa používajú v nadradenom procese. Neberie žiadne parametre a vracia celočíselné hodnoty.

Nižšie sú uvedené rôzne hodnoty vrátené funkciou fork().



  • Záporná hodnota : Vytvorenie podriadeného procesu bolo neúspešné.
  • nula : Návrat k novovytvorenému podradenému procesu.
  • Pozitívna hodnota : Vrátené rodičovi alebo volajúcemu. Hodnota obsahuje ID procesu novovytvoreného podriadeného procesu.

vytvorenie vidlicového procesu

Poznámka: fork() je funkcia založená na vláknach, na získanie správneho výstupu spustite program na lokálnom systéme.

Upozorňujeme, že vyššie uvedené programy sa nekompilujú v prostredí Windows.

Príklad fork() v C

C


reťazec java zreťaziť



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

>

>

Výkon

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

Príklad 2: Vypočítajte, koľkokrát sa vytlačí ahoj.

C




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

>

>

Výkon

hello hello hello hello hello hello hello hello>

Vysvetlenie

Počet vytlačení „ahoj“ sa rovná počtu vytvorených procesov. Celkový počet procesov = 2n, kde n je počet systémových volaní vidlice. Takže tu n = 3, 23= 8 Dajme nejaké názvy štítkov pre tri riadky:

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>

Celkovo teda existuje osem procesov (nové podradené procesy a jeden pôvodný proces). Ak by sme chceli znázorniť vzťah medzi procesmi ako stromovú hierarchiu, bolo by to nasledovné: Hlavný proces: P0 Procesy vytvorené 1. vidličkou: P1 Procesy vytvorené 2. vidličkou: P2, P3 Procesy vytvorené 3. vidličkou: P4, P5, P6, P7

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

Príklad 3: Predpovedajte výstup nasledujúceho programu.

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

>

>

Výkon

Hello from Parent! Hello from Child!>

Poznámka: Vo vyššie uvedenom kóde je vytvorený podradený proces. fork() vracia 0 v podradenom procese a kladné celé číslo v nadradenom procese. Tu sú možné dva výstupy, pretože nadradený proces a podriadený proces bežia súčasne. Nevieme teda, či operačný systém najprv poskytne kontrolu nadradenému procesu alebo podriadenému procesu.

Nadradený proces a podriadený proces bežia na rovnakom programe, ale to neznamená, že sú totožné. OS prideľuje rôzne údaje a stavy pre tieto dva procesy a tok riadenia týchto procesov môže byť odlišný. Pozrite si nasledujúci príklad:

Príklad 4: Predpovedajte výstup nasledujúceho programu.

C




previesť znak na reťazec 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;> }>

>

>

Výkon

Parent has x = 0 Child has x = 2>

alebo

Výkon

Child has x = 2 Parent has x = 0>

Tu zmena globálnej premennej v jednom procese neovplyvňuje dva ďalšie procesy, pretože údaje/stav týchto dvoch procesov sú odlišné. A tiež rodič a dieťa bežia súčasne, takže sú možné dva výstupy.

fork() vs exec()

Systémové volanie vidlice vytvorí nový proces. Nový proces vytvorený pomocou fork() je kópiou aktuálneho procesu okrem vrátenej hodnoty. Na druhej strane systémové volanie exec() nahrádza aktuálny proces novým programom.

Problémy založené na C fork()

1. Proces vykoná nasledujúci kód

C




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

>

>

Celkový počet vytvorených podriadených procesov je (GATE-CS-2008)

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

stránky ako bežná stránka

Pozrite si toto riešenie.

2. Zvážte nasledujúci fragment kódu:

C




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

>

>

Nech u, v sú hodnoty vytlačené rodičovským procesom a x, y sú hodnoty vytlačené podriadeným procesom. Ktorá z nasledujúcich možností je PRAVDA? (GATE-CS-2005)

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

Pozrite si toto riešenie.

3. Predpovedajte výstup nižšie uvedeného programu.

C




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

>

>

Pozrite si toto riešenie

Súvisiace články:

python je číselný
  • C program na demonštráciu fork() a pipe()
  • Zombie a sirotské procesy v C
  • fork() a pamäťové zdieľané čiernobiele procesy vytvorené pomocou neho