logo

gaffel() i C

Fork-systemkallet brukes til å lage en ny prosess i Linux, og Unix-systemer, som kalles barneprosess , som kjører samtidig med prosessen som gjør at fork() kaller (overordnet prosess). Etter at en ny underordnet prosess er opprettet, vil begge prosessene utføre den neste instruksjonen etter systemkallet fork().

Den underordnede prosessen bruker samme pc(programteller), samme CPU-registre og de samme åpne filene som brukes i den overordnede prosessen. Den tar ingen parametere og returnerer en heltallsverdi.



Nedenfor er forskjellige verdier returnert av fork().

  • Negativ verdi : Opprettelsen av en barneprosess var mislykket.
  • Null : Går tilbake til den nyopprettede underordnede prosessen.
  • Positiv verdi : Returnert til forelder eller innringer. Verdien inneholder prosess-ID-en til den nyopprettede underordnede prosessen.

lage en gaffelprosess

Merk: fork() er trådbasert funksjon, for å få riktig utgang, kjør programmet på et lokalt system.



Vær oppmerksom på at programmene ovenfor ikke kompileres i et Windows-miljø.

Eksempel på gaffel() i C

C




string.format i java



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

>

>

Produksjon

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

Eksempel 2: Regn ut antall ganger hello skrives ut.

C




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

>

>

Produksjon

hello hello hello hello hello hello hello hello>

Forklaring

Antall ganger 'hei' skrives ut er lik antallet opprettede prosesser. Totalt antall prosesser = 2n, hvor n er antall gaffelsystemanrop. Så her er n = 3, 23= 8 La oss sette noen etikettnavn for de tre linjene:

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å det er totalt åtte prosesser (nye underordnede prosesser og en original prosess). Hvis vi ønsker å representere forholdet mellom prosessene som et trehierarki vil det være følgende: Hovedprosessen: P0 Prosesser opprettet av 1. gaffel: P1 Prosesser opprettet av 2. gaffel: P2, P3 Prosesser opprettet av 3. gaffel: P4, P5, P6, P7

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

Eksempel 3: Forutsi utgangen til 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;> }>

>

>

Produksjon

Hello from Parent! Hello from Child!>

Merk: I koden ovenfor opprettes en underordnet prosess. fork() returnerer 0 i den underordnede prosessen og positivt heltall i den overordnede prosessen. Her er to utganger mulig fordi den overordnede prosessen og den underordnede prosessen kjører samtidig. Så vi vet ikke om operativsystemet først vil gi kontroll til foreldreprosessen eller barneprosessen.

Overordnet prosess og underordnet prosess kjører det samme programmet, men det betyr ikke at de er identiske. OS tildeler forskjellige data og tilstander for disse to prosessene, og kontrollflyten til disse prosessene kan være forskjellig. Se neste eksempel:

Eksempel 4: Forutsi utgangen til følgende program.

C




natasha dalal

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

>

>

Produksjon

java-sammenhengende strenger
Parent has x = 0 Child has x = 2>

eller

Produksjon

Child has x = 2 Parent has x = 0>

Her påvirker ikke global variabel endring i en prosess to andre prosesser fordi dataene/tilstanden til de to prosessene er forskjellige. Og også foreldre og barn kjører samtidig, slik at to utganger er mulig.

gaffel() vs exec()

Gaffelsystemanropet oppretter en ny prosess. Den nye prosessen opprettet av fork() er en kopi av den gjeldende prosessen bortsett fra den returnerte verdien. På den annen side erstatter exec()-systemkallet den nåværende prosessen med et nytt program.

Problemer basert på C gaffel()

1. En prosess utfører følgende kode

C




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

>

>

Det totale antallet underordnede prosesser som er opprettet 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. Tenk på følgende kodefragment:

C




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

>

>

La u, v være verdiene som skrives ut av den overordnede prosessen, og x, y være verdiene som skrives ut av den underordnede prosessen. Hvilken av følgende er SANN? (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

hei verden med java

Se dette for en løsning.

3. Forutsi resultatet av programmet nedenfor.

C




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

>

>

Se denne for løsningen

Relaterte artikler :

  • C-program for å demonstrere gaffel() og pipe()
  • Zombie og foreldreløse prosesser i C
  • fork() og minne delte s/h-prosesser opprettet ved hjelp av den