Apelul de sistem Fork este folosit pentru crearea unui nou proces în Linux și sistemele Unix, care se numește proces copil , care rulează concomitent cu procesul care face apelul fork() (procesul părinte). După ce este creat un nou proces copil, ambele procese vor executa următoarea instrucțiune după apelul de sistem fork().
Procesul copil folosește același computer (contor de programe), aceleași registre CPU și aceleași fișiere deschise pe care le folosesc în procesul părinte. Nu ia parametri și returnează o valoare întreagă.
Mai jos sunt diferite valori returnate de fork().
- Valoare negativă : Crearea unui proces copil nu a avut succes.
- Zero : a revenit la procesul copil nou creat.
- Valoare pozitivă : returnat părintelui sau apelantului. Valoarea conține ID-ul procesului al procesului copil nou creat.

Notă: fork() este o funcție bazată pe threading, pentru a obține rezultatul corect, rulați programul pe un sistem local.
Vă rugăm să rețineți că programele de mai sus nu se compila într-un mediu Windows.
Exemplu de fork() în C
C
Seria Fibonacci în c
#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;> }> |
>
>Ieșire
Hello world!, process_id(pid) = 31 Hello world!, process_id(pid) = 32>
Exemplul 2: Calculați de câte ori este tipărit Hello.
C
#include> #include> #include> int> main()> {> >fork();> >fork();> >fork();> >printf>(>'hello
'>);> >return> 0;> }> |
>
>Ieșire
hello hello hello hello hello hello hello hello>
Explicaţie
Numărul de ori „bună ziua” este tipărit este egal cu numărul de procese create. Numărul total de procese = 2n, unde n este numărul de apeluri de sistem furk. Deci aici n = 3, 23= 8 Să punem câteva nume de etichetă pentru cele trei linii:
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>
Deci, există un total de opt procese (procese copil noi și un proces original). Dacă vrem să reprezentăm relația dintre procese ca o ierarhie arborescentă, ar fi următoarea: Procesul principal: P0 Procese create de prima furcă: P1 Procese create de a doua furcă: P2, P3 Procese create de a treia furcă: P4, P5, P6, P7
P0 / | P1 P4 P2 / P3 P6 P5 / P7>
Exemplul 3: Preziceți rezultatul următorului 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;> }> |
>
>Ieșire
Hello from Parent! Hello from Child!>
Notă: În codul de mai sus, este creat un proces copil. fork() returnează 0 în procesul copil și un întreg pozitiv în procesul părinte. Aici sunt posibile două ieșiri deoarece procesul părinte și procesul copil rulează simultan. Deci nu știm dacă sistemul de operare va da mai întâi control procesului părinte sau procesului copil.
Procesul părinte și procesul copil rulează același program, dar asta nu înseamnă că sunt identice. OS alocă date și stări diferite pentru aceste două procese, iar fluxul de control al acestor procese poate fi diferit. Vezi următorul exemplu:
Exemplul 4: Preziceți rezultatul următorului program.
C
char la întreg 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;> }> |
>
gzip pentru Linux
>Ieșire
Parent has x = 0 Child has x = 2>
sau
Ieșire
Child has x = 2 Parent has x = 0>
Aici, modificarea variabilei globale într-un proces nu afectează alte două procese deoarece datele/starea celor două procese este diferită. Și, de asemenea, părintele și copilul rulează simultan, astfel încât sunt posibile două ieșiri.
fork() vs exec()
Apelul de sistem fork creează un nou proces. Noul proces creat de fork() este o copie a procesului curent, cu excepția valorii returnate. Pe de altă parte, apelul de sistem exec() înlocuiește procesul curent cu un program nou.
Probleme bazate pe C fork()
1. Un proces execută următorul cod
C
for> (i = 0; i fork();> |
>
>
Numărul total de procese copil create este (GATE-CS-2008)
(A) n
(B) 2^n – 1
(C) 2^n
(D) 2^(n+1) – 1
Vedeți asta pentru o soluție.
2. Luați în considerare următorul fragment de cod:
C
if> (fork() == 0) {> >a = a + 5;> >printf>(>'%d, %d
'>, a, &a);> }> else> {> >a = a –5;> >printf>(>'%d, %d
'>, a, &a);> }> |
>
>
Fie u, v valorile tipărite de procesul părinte și x, y valorile imprimate de procesul copil. Care dintre următoarele este ADEVĂRAT? (GATE-CS-2005)
Descărcați videoclipuri de pe youtube pe vlc
(A) u = x + 10 și v = y
(B) u = x + 10 și v != y
(C) u + 10 = x și v = y
(D) u + 10 = x și v != y
Vedeți asta pentru o soluție.
3. Preziceți rezultatul programului de mai jos.
C
#include> #include> int> main()> > >fork();> >fork() && fork()> |
>
>
Vezi asta pentru soluție
Articole similare :
- Program C pentru a demonstra fork() și pipe()
- Procese zombie și orfane în C
- fork() și procesele b/n partajate în memorie create folosindu-l