C artikler :: fork - kreer en ny process
Eksempel på anvendelse af fork().
Programmet kører således:
# gcc eks_fork.c
# ./a.out
PARENT: Jeg er parent processen!
CHILD: Jeg er child processen!
CHILD: Min PID er 17166
CHILD: Min parent's PID er 17165
PARENT: Min PID er 17165
PARENT: Min child's PID er 17166
PARENT: Jeg venter nu på at min child skal terminere med exit()...
CHILD: global = 2
CHILD: Indtast exit status (lav et lille tal): 3
CHILD: Jeg skal ud herfra!
PARENT: global = 1
PARENT: Min child's exit status er: 3
PARENT: Jeg skal ud herfra!
#
# ./a.out
PARENT: Jeg er parent processen!
CHILD: Jeg er child processen!
CHILD: Min PID er 17166
CHILD: Min parent's PID er 17165
PARENT: Min PID er 17165
PARENT: Min child's PID er 17166
PARENT: Jeg venter nu på at min child skal terminere med exit()...
CHILD: global = 2
CHILD: Indtast exit status (lav et lille tal): 3
CHILD: Jeg skal ud herfra!
PARENT: global = 1
PARENT: Min child's exit status er: 3
PARENT: Jeg skal ud herfra!
#
Her ser du kommanterer til programlinierne:
16 | fork() deler process, om muligt, returværdien gemmes i pid. Husk at hvis det lykkes vil der være 2 processer med hver deres variabler. Parent har en værdi i pid og child har en anden. Selvom det er samme variabelnavn er de på forskellige steder i memory. |
17-19 | Håndterer fejl fra fork(), -1 betyder at der ikke blev dannet en child. |
21-31 | Kode for childprocessen fordi fork() returnerede 0. Med getpid() fås process ID'en for processen selv og med getppid() fås process ID'en for parent. |
25 | Sæt global bare for at bevise at parent stadig har sin egen værdi. |
26 | Child sover et sekund for at prompten til indtastning af returværdi kommer sammen med scanf(), derved giver vi CPU til parent processen så den kan blive færdig med udskrifter. |
32-42 | Her hersker parent. |
35 | Ved fork() bliver pid process ID'en for child. |
37 | Sæt global til 1 for at bevise at child's værdi på 2 ikke overskrives, det ses efter at child er startet igen efter 1 sekund i sleep(). |
38 | Parent afventer at child skal terminere. |