Fork sistēmas izsaukums tiek izmantots, lai izveidotu jaunu procesu Linux un Unix sistēmās, ko sauc par bērna process , kas darbojas vienlaikus ar procesu, kas izsauc fork() izsaukumu (vecākprocess). Pēc jauna pakārtota procesa izveides abi procesi izpildīs nākamo instrukciju pēc fork() sistēmas izsaukuma.
Bērnu process izmanto to pašu datoru (programmu skaitītāju), tos pašus CPU reģistrus un tos pašus atvērtos failus, kas tiek izmantoti vecāku procesā. Tas neprasa parametrus un atgriež vesela skaitļa vērtību.
Tālāk ir norādītas dažādas vērtības, ko atgriež fork ().
- Negatīvā vērtība : Bērna procesa izveide bija neveiksmīga.
- Nulle : Atgriezts pie jaunizveidotā bērna procesa.
- Pozitīva vērtība : atgriezts vecākiem vai zvanītājam. Vērtība satur jaunizveidotā pakārtotā procesa ID.

Piezīme: fork () ir vītņu funkcija, lai iegūtu pareizo izvadi, palaidiet programmu vietējā sistēmā.
Lūdzu, ņemiet vērā, ka iepriekš minētās programmas netiek kompilētas Windows vidē.
Fork() piemērs valodā C
C
pārvērst virkni par datumu
#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;> }> |
>
>Izvade
Hello world!, process_id(pid) = 31 Hello world!, process_id(pid) = 32>
2. piemērs. Aprēķiniet, cik reižu sveiks tiek izdrukāts.
C
#include> #include> #include> int> main()> {> >fork();> >fork();> >fork();> >printf>(>'hello
'>);> >return> 0;> }> |
>
>Izvade
hello hello hello hello hello hello hello hello>
Paskaidrojums
“Sveiki” drukāšanas reižu skaits ir vienāds ar izveidoto procesu skaitu. Kopējais procesu skaits = 2n, kur n ir dakšu sistēmas izsaukumu skaits. Tātad šeit n = 3, 23= 8 Ieliksim dažus etiķešu nosaukumus trim rindām:
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>
Tātad pavisam ir astoņi procesi (jauni bērnprocesi un viens sākotnējais process). Ja mēs vēlamies attēlot attiecības starp procesiem kā koka hierarhiju, tas būtu šāds: Galvenais process: P0 1. dakšas izveidotie procesi: P1 2. dakšas izveidotie procesi: P2, P3 3. dakšas izveidotie procesi: P4, P5, P6, P7
P0 / | P1 P4 P2 / P3 P6 P5 / P7>
3. piemērs. Paredziet šādas programmas izvadi.
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;> }> |
>
>Izvade
Hello from Parent! Hello from Child!>
Piezīme: Iepriekš minētajā kodā tiek izveidots bērna process. fork() atgriež 0 bērnprocesā un pozitīvu veselu skaitli vecākprocesā. Šeit ir iespējamas divas izejas, jo vecākais process un pakārtotais process darbojas vienlaikus. Tāpēc mēs nezinām, vai OS vispirms piešķirs kontroli pār vecāku vai bērna procesu.
Vecāku process un bērna process palaiž vienu un to pašu programmu, taču tas nenozīmē, ka tie ir identiski. OS šiem diviem procesiem piešķir dažādus datus un stāvokļus, un šo procesu vadības plūsma var būt atšķirīga. Skatiet nākamo piemēru:
4. piemērs: prognozējiet šādas programmas izvadi.
C
kā pārvērst veselu skaitli virknē 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;> }> |
>
>Izvade
Parent has x = 0 Child has x = 2>
vai
Izvade
Child has x = 2 Parent has x = 0>
Šeit globālā mainīgā izmaiņas vienā procesā neietekmē divus citus procesus, jo abu procesu dati/stāvoklis ir atšķirīgi. Un arī vecāks un bērns darbojas vienlaikus, tāpēc ir iespējami divi izvadi.
fork () vs exec ()
Fork sistēmas izsaukums rada jaunu procesu. Jaunais process, ko izveidoja fork (), ir pašreizējā procesa kopija, izņemot atgriezto vērtību. No otras puses, sistēmas izsaukums exec() aizstāj pašreizējo procesu ar jaunu programmu.
Problēmas, kuru pamatā ir C fork()
1. Process izpilda šādu kodu
C
for> (i = 0; i fork();> |
>
>
Kopējais izveidoto bērnu procesu skaits ir (GATE-CS-2008)
(A) n
(B) 2^n – 1
(C) 2^n
(D) 2^ (n+1) – 1
Skatiet šo, lai atrastu risinājumu.
2. Apsveriet šādu koda fragmentu:
C
f filmas
if> (fork() == 0) {> >a = a + 5;> >printf>(>'%d, %d
'>, a, &a);> }> else> {> >a = a –5;> >printf>(>'%d, %d
'>, a, &a);> }> |
>
>
matricas programma c valodā
Lai u, v ir vecākprocesa izdrukātās vērtības, un x, y ir vērtības, ko izdrukā pakārtotais process. Kurš no šiem apgalvojumiem ir PATIESI? (GATE-CS-2005)
(A) u = x + 10 un v = y
(B) u = x + 10 un v != y
(C) u + 10 = x un v = y
(D) u + 10 = x un v != y
Skatiet šo, lai atrastu risinājumu.
3. Paredziet tālāk norādītās programmas rezultātu.
C
#include> #include> int> main()> > >fork();> >fork() && fork()> |
>
>
Skatiet šo risinājumu
Saistītie raksti :
- C programma, lai demonstrētu fork () un pipe ()
- Zombiju un bāreņu procesi programmā C
- fork() un atmiņas koplietotie melnbaltie procesi, kas izveidoti, izmantojot to