C artikler :: fork - kreer en ny process

Eksempel på anvendelse af fork().

1 /* eks_fork.c - Kreer nye processer eller tråde */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <errno.h> 5 #include <unistd.h> 6 #include <sys/types.h> 7 #include <sys/wait.h> 8 9 static int global; /* Hver process sin egen kopi */ 10 11 main() 12 { 13 pid_t pid; 14 int retval; 15 16 switch(pid=fork()) { 17 case -1: 18 perror("fork"); /* noget gik galt */ 19 exit(1); /* parent terminerer */ 20 21 case 0: 22 printf(" CHILD: Jeg er child processen!\n"); 23 printf(" CHILD: Min PID er %d\n", getpid()); 24 printf(" CHILD: Min parent's PID er %d\n", getppid()); 25 global = 2; 26 sleep(1); /* sleep for 1 sekund */ 27 printf(" CHILD: global = %d\n", global); 28 printf(" CHILD: Indtast exit status (lav et lille tal): "); 29 scanf(" %d", &retval); 30 printf(" CHILD: Jeg skal ud herfra!\n"); 31 exit(retval); /* child terminerer */ 32 default: 33 printf("PARENT: Jeg er parent processen!\n"); 34 printf("PARENT: Min PID er %d\n", getpid()); 35 printf("PARENT: Min child's PID er %d\n", pid); 36 printf("PARENT: Jeg venter på at child skal kalde exit()...\n"); 37 global = 1; 38 wait(&retval); 39 printf("PARENT: global = %d\n", global); 40 printf("PARENT: Min child's exit status er: %d\n" 41 , WEXITSTATUS(retval)); 42 printf("PARENT: Jeg skal ud herfra!\n"); 43 } 44 }

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!
#

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.

 

 

 

Ressourcer C Library opslag The Single UNIX® Specification, Version 2 Copyright © 1997 The Open Group GNU C Library Engelsk, med masser af gode og dybe artikler. Danske søgeord Find selv de bedste danske søgeord til din hjemmeside.
Produkter Bookingsystem
System for reservation af tid for behandlinger, aftaler, lokaler, udstyr, personale. Tilpasset lektionstimer. Udskriver arbejdsplaner og ugeskema for opslag. Statistik. Danmarks bedste pris nu kun kr. 1.695,-
HelpdeskEffektiviser din support-organisation med et Helpdesksystem. Fjern tidrøvere der forhindrer fokus på problemløsning. Lektionsplan Formidling af generelle information og specifikke lektioner fra undervisere til studerende/elever. Medlemssystem Medlemssystem online med administration af medlemskartotek, kontingentbetalinger, flettefiler m.m.
Styr selv Styr selv indholdet på dine hjemmesider med Content Management System.
Citat I denne verden er der intet der kan siges at være sikkert, undtagen død og skatter.

Benjamin Franklin



Professionelle løsninger til Internettet. Webdesign, e-handel, cms, søgeoptimering, webhotel, analyse, Intranet mm.