Fork-systemkaldet bruges til at skabe en ny proces i Linux og Unix-systemer, som kaldes børneproces , som kører sideløbende med den proces, der laver fork()-kaldet (overordnet proces). Efter at en ny underordnet proces er oprettet, vil begge processer udføre den næste instruktion efter fork() systemkaldet.
Den underordnede proces bruger den samme pc(programtæller), de samme CPU-registre og de samme åbne filer, som bruges i den overordnede proces. Det tager ingen parametre og returnerer en heltalsværdi.
Nedenfor er forskellige værdier returneret af fork().
- Negativ værdi : Oprettelsen af en børneproces var mislykket.
- Nul : Vendte tilbage til den nyoprettede underordnede proces.
- Positiv værdi : Returneres til forælder eller opkalder. Værdien indeholder proces-id'et for den nyoprettede underordnede proces.

Bemærk: fork() er trådbaseret funktion, for at få det korrekte output køre programmet på et lokalt system.
Bemærk venligst, at ovenstående programmer ikke kompilerer i et Windows-miljø.
Eksempel på gaffel() i C
C
javascript globale variabler
#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;> }> |
>
>Produktion
Hello world!, process_id(pid) = 31 Hello world!, process_id(pid) = 32>
Eksempel 2: Beregn antallet af gange, der udskrives hej.
C
#include> #include> #include> int> main()> {> >fork();> >fork();> >fork();> >printf>(>'hello
'>);> >return> 0;> }> |
>
>Produktion
hello hello hello hello hello hello hello hello>
Forklaring
Antallet af gange, der udskrives 'hej', er lig med antallet af oprettede processer. Samlet antal processer = 2n, hvor n er antallet af gaffelsystemkald. Så her er n = 3, 23= 8 Lad os sætte nogle etiketnavne til de tre linjer:
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>
Så der er i alt otte processer (nye underordnede processer og en original proces). Hvis vi ønsker at repræsentere forholdet mellem processerne som et træhierarki, ville det være følgende: Hovedprocessen: P0 Processer skabt af 1. gaffel: P1 Processer skabt af 2. gaffel: P2, P3 Processer skabt af 3. gaffel: P4, P5, P6, P7
P0 / | P1 P4 P2 / P3 P6 P5 / P7>
Eksempel 3: Forudsig output fra følgende program.
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;> }> |
>
>Produktion
Hello from Parent! Hello from Child!>
Bemærk: I ovenstående kode oprettes en underordnet proces. fork() returnerer 0 i den underordnede proces og positivt heltal i den overordnede proces. Her er to udgange mulige, fordi den overordnede proces og den underordnede proces kører samtidigt. Så vi ved ikke, om OS først vil give kontrol til forældreprocessen eller børneprocessen.
Overordnet proces og underordnet proces kører det samme program, men det betyder ikke, at de er identiske. OS tildeler forskellige data og tilstande for disse to processer, og kontrolflowet for disse processer kan være forskelligt. Se næste eksempel:
Eksempel 4: Forudsig output fra følgende program.
C
bash hvis andet
#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;> }> |
>
>Produktion
java streng sammenligning
Parent has x = 0 Child has x = 2>
eller
Produktion
Child has x = 2 Parent has x = 0>
Her påvirker global variabel ændring i én proces ikke to andre processer, fordi de to processers data/tilstand er forskellig. Og også forældre og barn kører samtidigt, så to udgange er mulige.
fork() vs exec()
Gaffelsystemkaldet opretter en ny proces. Den nye proces oprettet af fork() er en kopi af den aktuelle proces bortset fra den returnerede værdi. På den anden side erstatter exec() systemkaldet den nuværende proces med et nyt program.
Problemer baseret på C fork()
1. En proces udfører følgende kode
C
for> (i = 0; i fork();> |
>
>
Det samlede antal oprettede underordnede processer er (GATE-CS-2008)
(A) n
(B) 2^n – 1
(C) 2^n
(D) 2^(n+1) – 1
Se dette for en løsning.
2. Overvej følgende kodefragment:
C
if> (fork() == 0) {> >a = a + 5;> >printf>(>'%d, %d
'>, a, &a);> }> else> {> >a = a –5;> >printf>(>'%d, %d
'>, a, &a);> }> |
>
>
Lad u, v være værdierne udskrevet af den overordnede proces, og x, y være værdierne udskrevet af den underordnede proces. Hvilken af følgende er SAND? (GATE-CS-2005)
(A) u = x + 10 og v = y
(B) u = x + 10 og v != y
(C) u + 10 = x og v = y
(D) u + 10 = x og v != y
hej verden med java
Se dette for en løsning.
3. Forudsige outputtet af nedenstående program.
C
#include> #include> int> main()> > >fork();> >fork() && fork()> |
>
>
Se dette for løsningen
Relaterede artikler :
- C-program til at demonstrere gaffel() og pipe()
- Zombie og forældreløse processer i C
- fork() og hukommelsesdelte s/h-processer oprettet ved hjælp af det