La crida al sistema Fork s'utilitza per crear un procés nou a Linux i sistemes Unix, que s'anomena procés infantil , que s'executa simultàniament amb el procés que fa la trucada fork() (procés pare). Després de crear un nou procés fill, tots dos processos executaran la següent instrucció després de la crida al sistema fork().
El procés fill utilitza el mateix ordinador (comptador de programes), els mateixos registres de la CPU i els mateixos fitxers oberts que s'utilitzen en el procés principal. No pren paràmetres i retorna un valor enter.
A continuació es mostren diferents valors retornats per fork().
- Valor negatiu : La creació d'un procés fill no ha tingut èxit.
- Zero : S'ha tornat al procés fill acabat de crear.
- Valor positiu : retornat al pare o a la persona que truca. El valor conté l'ID de procés del procés fill acabat de crear.

Nota: fork() és una funció basada en fils, per obtenir la sortida correcta, executeu el programa en un sistema local.
Tingueu en compte que els programes anteriors no es compilen en un entorn Windows.
Exemple de fork() a C
C
10 de 50
#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;> }> |
>
>Sortida
Hello world!, process_id(pid) = 31 Hello world!, process_id(pid) = 32>
Exemple 2: calculeu el nombre de vegades que s'imprimeix hola.
C
#include> #include> #include> int> main()> {> >fork();> >fork();> >fork();> >printf>(>'hello
'>);> >return> 0;> }> |
>
>Sortida
hello hello hello hello hello hello hello hello>
Explicació
El nombre de vegades que s'imprimeix 'hola' és igual al nombre de processos creats. Nombre total de processos = 2n, on n és el nombre de trucades al sistema fork. Per tant, aquí n = 3, 23= 8 Posem alguns noms d'etiquetes per a les tres línies:
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>
Per tant, hi ha un total de vuit processos (processos fills nous i un procés original). Si volem representar la relació entre els processos com una jerarquia en arbre seria la següent: El procés principal: P0 Processos creats per la 1a bifurcació: P1 Processos creats per la 2a bifurcació: P2, P3 Processos creats per la 3a bifurcació: P4, P5, P6, P7
P0 / | P1 P4 P2 / P3 P6 P5 / P7>
Exemple 3: prediu la sortida del programa següent.
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;> }> |
>
>Sortida
Hello from Parent! Hello from Child!>
Nota: Al codi anterior, es crea un procés fill. fork() retorna 0 al procés fill i un enter positiu al procés pare. Aquí, són possibles dues sortides perquè el procés principal i el procés fill s'executen simultàniament. Per tant, no sabem si el sistema operatiu donarà primer el control al procés principal o al procés secundari.
El procés pare i el procés fill executen el mateix programa, però això no vol dir que siguin idèntics. El sistema operatiu assigna diferents dades i estats per a aquests dos processos, i el flux de control d'aquests processos pot ser diferent. Vegeu el següent exemple:
Exemple 4: prediu la sortida del programa següent.
C
programació r en c
#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;> }> |
>
>Sortida
Parent has x = 0 Child has x = 2>
o
Sortida
Child has x = 2 Parent has x = 0>
Aquí, el canvi de variable global en un procés no afecta altres dos processos perquè les dades/estat dels dos processos són diferents. I també pare i fill funcionen simultàniament, de manera que són possibles dues sortides.
fork() vs exec()
La trucada al sistema de bifurcació crea un procés nou. El nou procés creat per fork() és una còpia del procés actual excepte el valor retornat. D'altra banda, la crida al sistema exec() substitueix el procés actual per un nou programa.
Problemes basats en C fork()
1. Un procés executa el codi següent
C
xifres romanes 1100
for> (i = 0; i fork();> |
>
>
El nombre total de processos fills creats és (GATE-CS-2008)
(A) n
(B) 2^n – 1
(C) 2^n
(D) 2^(n+1) – 1
Vegeu això per obtenir una solució.
2. Considereu el fragment de codi següent:
C
if> (fork() == 0) {> >a = a + 5;> >printf>(>'%d, %d
'>, a, &a);> }> else> {> >a = a –5;> >printf>(>'%d, %d
'>, a, &a);> }> |
>
>
Siguin u, v els valors impresos pel procés pare i x, y els valors impresos pel procés fill. Quina de les següents és CERT? (GATE-CS-2005)
(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
Vegeu això per obtenir una solució.
3. Prediu la sortida del programa següent.
C
slf4j vs log4j
#include> #include> int> main()> > >fork();> >fork() && fork()> |
>
>
Vegeu això per a la solució
Articles relacionats :
- Programa C per demostrar fork() i pipe()
- Processos zombis i orfes a C
- fork() i processos en b/n compartits de memòria creats utilitzant-lo