La lecture en ligne est gratuite
Lire Télécharger
Syst`emesdexploitation
Jean-S
Cours no. 14
Jean-S´ebastienCoron
e´
Universite´duLuxembourg
b
December 5, 2009
astienCronoSyste`mesdepxlioatitno
CnronoyStse`emdsJean-S´ebastieitloxpe
Le recouvrement de processus. Rappel sur les processus UNIX. Rappel sur fork() et wait . Les fonctions execv() et execlp() .
nioattammenoirPargoIXsonCUNus
oreceLpssussJn-eaon
Cre´ationdunprocessus. Lorsqu’on entre une commande, le shell lance un processus pourlex´ecuter. Le shell attend la fin du processus, puis attend la commande suivante. Arborescence de processus. Chaque processus a un p`ere ,celuiquilalanc´e. Lenum´eroduprocessusdup`ereestlePPID. Unprocessusp`erepeutavoirplusieursprocessus fils Sous UNIX, un premier processus init estcr´e´eavecunPID de1.Anc`etredetouslesprocessus.
tatiseme`tsyiolpxedtiasebS´nSroCoen
sabe´S-naeJitneoCorSnsy`tmeesdexploitation
Duplication d’un processus. Seulefa¸condecre´erunprocessusa`basniveau. Appelsyste`me fork() Cr´eeunecopiecompleˆteduprocessus,lsdeceprocessus. Le fils change de programme en appelant exec() . La fonction exec() remplacelecodeetsesdonne´esparcelui d’une nouvelle commande.
dnpeorecsssuCr´eatio
Eutiox´ecneconduednamm
Exe´cutiondunecommande: tar -zcvf file * Le shell se duplique avec fork() . On a alors deux processus shell identiques. Leshellpe`reattendlanduprocessuslsavec wait() . Leshelllsremplacesonex´ecutableparceluidelacommande tar avec exec() La commande tar sexe´cute.Lorsquellesetermine,le processus fils disparait. Leshellp`ereestr´eactive´etattendlacommandesuivante.
nSyst`emtienCoroioatitnosedxelpsabe´S-naeJ
tion
L’appel a fork() duplique le processus. Lex´ecutioncontinuedanslesdeuxprocessus. Valeurretourne´epar fork() : Dansleprocessusp`ere,retournelePIDduls. Dans le processus fils, retourne 0. Silefork´echoue,renvoie-1. getpid() et getppid() getpid() retourne le PID du processus. getppid() retournelePIDdupe`reduprocessus.
rpaLievitimi()rkfontt`emesdexploitabesaitneoCorSnsyeaJS´n-
)ro(kExemvecfpleaJean-S´ebastieCnronoyStse`emdsitloxpe
#include <stdio.h> #include <unistd.h> int main() { int pidfils=fork(); if(pidfils!=0) { printf("Jesuislep`ere."); printf("PID de mon fils:%d\n",pidfils); } else { printf("Je suis le fils."); printf("Mon pid est:%d\n",getpid()); } }
nioat
mexEk(or)eaplcfveolpxedsnoitationornCieme`estSyeJnaabtsS-e´
R´sultat: e $ forksimple Jesuislep`ere.PIDdemonfils:2864 Je suis le fils.Mon PID est:2864 $ Peut aussi apparaˆıtre dans l’ordre inverse.
etititexaw´Sbeae-nJyst`ronSenCoastiiolpitatsemexed
La primitive wait permeta`unprocessusdattendrelan d’un de ses fils. Si pas de fils ou erreur, retourne -1. Sinon, retourne le PID du fils qui s’est termi ´ ne. Doitˆetreappeleavec wait(0) ´ La primitive exit permet de terminer le processus qui l’appelle. void exit(int status) status permetdindiquerauprocessusp`erequuneerreur s’est produite. status=0 si pas d’erreur.
on
Jeaebasn-S´plexdesontitaoioroCneitme`tsySnemExepl
int pidfils=fork();
if(pidfils!=0) { printf("Jesuislep`ere.\n"); wait(0); printf("mon fils a termi ´ \ "); ne. n } else { printf("je suis le fils.\n"); sleep(2); printf("arre^tdufils.\n"); exit(0); }
ssuesocprdevueremtneRoction
Recouvrement de processus Remplaceunautrecodelecodeex´ecuteparunprocessus. ´ Sutiliseeng´ene´ralapre`sun fork . Leprogrammeetlesdonne´esduprocessuschangent. Maisgardemeˆmepidetmˆemep`ere. M´ecanismelorsdelappeldunprogramme(ex, ls ) Terminal de commande fait un fork() . Processuscr´e´erecouvertparleprogramme ls . Leterminal(pe`re)attendlandesonls(appelsyst`eme wait() )
`tmesedxelpioatentiasebysnSroCo´S-naeJ