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.

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