logo

šakutė () C

„Fork“ sistemos skambutis naudojamas kuriant naują procesą „Linux“ ir „Unix“ sistemose, kuris vadinamas „ vaiko procesas , kuris vykdomas kartu su procesu, kuris iškviečia fork() (pagrindinis procesas). Sukūrus naują antrinį procesą, abu procesai vykdys kitą instrukciją po fork() sistemos iškvietimo.

Antrinis procesas naudoja tą patį kompiuterį (programų skaitiklį), tuos pačius procesoriaus registrus ir tuos pačius atidarytus failus, kurie naudojami pirminiame procese. Jis nereikalauja jokių parametrų ir grąžina sveikojo skaičiaus reikšmę.



Žemiau pateikiamos skirtingos reikšmės, kurias grąžino fork ().

  • Neigiama vertė : Vaiko proceso sukūrimas nepavyko.
  • Nulis : Grįžta prie naujai sukurto vaiko proceso.
  • Teigiama vertė : grąžinta tėvui arba skambinančiajam. Reikšmė apima naujai sukurto antrinio proceso ID.

šakutės proceso kūrimas

Pastaba: fork () yra sriegiais pagrįsta funkcija, kad gautumėte tinkamą išvestį, paleiskite programą vietinėje sistemoje.



Atminkite, kad aukščiau nurodytos programos nėra kompiliuojamos „Windows“ aplinkoje.

Fork() pavyzdys C

C




java spalvos



#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;> }>

>

>

Išvestis

Hello world!, process_id(pid) = 31 Hello world!, process_id(pid) = 32>

2 pavyzdys: Apskaičiuokite, kiek kartų bus atspausdintas labas.

C




#include> #include> #include> int> main()> {> >fork();> >fork();> >fork();> >printf>(>'hello '>);> >return> 0;> }>

>

>

Išvestis

hello hello hello hello hello hello hello hello>

Paaiškinimas

„Labas“ atspausdintų kartų skaičius yra lygus sukurtų procesų skaičiui. Bendras procesų skaičius = 2n, kur n yra šakės sistemos iškvietimų skaičius. Taigi čia n = 3, 23= 8 Įveskime keletą trijų eilučių etikečių pavadinimų:

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>

Taigi iš viso yra aštuoni procesai (nauji antriniai procesai ir vienas pradinis procesas). Jei norime pavaizduoti ryšį tarp procesų kaip medžio hierarchiją, tai būtų taip: Pagrindinis procesas: P0 1-osios šakutės sukurti procesai: P1 2-osios šakutės sukurti procesai: P2, P3 3-iosios šakutės sukurti procesai: P4, P5, P6, P7

 P0 / |  P1 P4 P2 /   P3 P6 P5 / P7>

3 pavyzdys: Numatykite šios programos išvestį.

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;> }>

>

>

Išvestis

Hello from Parent! Hello from Child!>

Pastaba: Aukščiau pateiktame kode sukuriamas antrinis procesas. fork() grąžina 0 antriniame procese ir teigiamą sveikąjį skaičių pirminiame procese. Čia galimi du išėjimai, nes pirminis ir antrinis procesas veikia vienu metu. Taigi mes nežinome, ar OS pirmiausia valdys pagrindinį, ar antrinį procesą.

Pirminis ir antrinis procesas vykdo tą pačią programą, tačiau tai nereiškia, kad jie yra identiški. OS šiems dviem procesams skiria skirtingus duomenis ir būsenas, o šių procesų valdymo srautas gali būti skirtingas. Žiūrėkite kitą pavyzdį:

4 pavyzdys: Numatykite šios programos išvestį.

C




java tostring metodas

#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;> }>

>

>

Išvestis

Parent has x = 0 Child has x = 2>

arba

Išvestis

Child has x = 2 Parent has x = 0>

Čia globalus kintamojo pasikeitimas viename procese neturi įtakos dviem kitiems procesams, nes dviejų procesų duomenys/būsena skiriasi. Taip pat tėvai ir vaikas veikia vienu metu, todėl galimi du išėjimai.

šakutė () vs exec ()

Šakės sistemos iškvietimas sukuria naują procesą. Fork () sukurtas naujas procesas yra dabartinio proceso kopija, išskyrus grąžintą reikšmę. Kita vertus, sistemos iškvietimas exec() pakeičia dabartinį procesą nauja programa.

Problemos, pagrįstos C fork()

1. Procesas vykdo šį kodą

C

pvr pilna forma




for> (i = 0; i fork();>

>

>

Bendras sukurtų antrinių procesų skaičius yra (GATE-CS-2008)

(A) n
(B) 2^n – 1
(C) 2^n
(D) 2^ (n+1) – 1

Norėdami rasti sprendimą, žiūrėkite tai.

2. Apsvarstykite šį kodo fragmentą:

C




if> (fork() == 0) {> >a = a + 5;> >printf>(>'%d, %d '>, a, &a);> }> else> {> >a = a –5;> >printf>(>'%d, %d '>, a, &a);> }>

>

>

Tegu u, v yra pirminio proceso išspausdintos reikšmės, o x, y – antrinio proceso išspausdintos reikšmės. Kuris iš šių teiginių yra TIKRAS? (GATE-CS-2005)

(A) u = x + 10 ir v = y
(B) u = x + 10 ir v != y
(C) u + 10 = x ir v = y
(D) u + 10 = x ir v != y

Norėdami rasti sprendimą, žiūrėkite tai.

3. Numatykite toliau pateiktos programos išvestį.

C

kur yra naršyklės nustatymai




#include> #include> int> main()> > >fork();> >fork() && fork()>

>

>

Norėdami rasti sprendimą, žiūrėkite tai

Susiję straipsniai :

  • C programa, skirta parodyti šakę () ir vamzdį ()
  • Zombių ir našlaičių procesai C
  • fork() ir atmintis bendrinami juodos spalvos procesai, sukurti naudojant jį