Syst`emes d’exploitationCours no. 14Jean-S´ebastien CoronUniversit´e du LuxembourgDecember 5, 2009Jean-S´ebastien Coron Syst`emes d’exploitationProgrammation en C sous UNIXLe recouvrement de processus.Rappel sur les processus UNIX.Rappel sur fork() et wait.Les fonctions execv() et execlp().Jean-S´ebastien Coron Syst`emes d’exploitationLes processusCr´eation d’un processus.Lorsqu’on entre une commande, le shell lance un processuspour l’ex´ecuter.Le shell attend la fin du processus, puis attend la commandesuivante.Arborescence de processus.Chaque processus a un p`ere, celui qui l’a lanc´e.Le num´ero du processus du p`ere est le PPID.Un processus p`ere peut avoir plusieurs processus filsSous UNIX, un premier processus init est cr´e´e avec un PIDde 1. Anc`etre de tous les processus.Jean-S´ebastien Coron Syst`emes d’exploitationCr´eation de processusDuplication d’un processus.Seule fac¸on de cr´eer un processus `a bas niveau.Appel syst`eme fork()Cr´ee une copie complˆete du processus, fils de ce processus.Le fils change de programme en appelant exec().La fonction exec() remplace le code et ses donn´ees par celuid’une nouvelle commande.Jean-S´ebastien Coron Syst`emes d’exploitationEx´ecution d’une commandeEx´ecution d’une commande: tar -zcvf file *Le shell se duplique avec fork(). On a alors deux processusshell identiques.Le shell p`ere attend la fin du processus fils avec wait().Le shell fils remplace son ex´ecutable par celui de la ...
Le recouvrement de processus. Rappel sur les processus UNIX. Rappel sur fork() et wait . Les fonctions execv() et execlp() .
nioattammenoirPargoIXsonCUNus
oreceLpssussJn-eaon
Cre´ationd’unprocessus. Lorsqu’on entre une commande, le shell lance un processus pourl’ex´ecuter. Le shell attend la fin du processus, puis attend la commande suivante. Arborescence de processus. Chaque processus a un p`ere ,celuiquil’alanc´e. Lenum´eroduprocessusdup`ereestlePPID. Unprocessusp`erepeutavoirplusieursprocessus fils Sous UNIX, un premier processus init estcr´e´eavecunPID de1.Anc`etredetouslesprocessus.
tatiseme`tsyiolpxe’dtiasebS´nSroCoen
sabe´S-naeJitneoCorSnsy`tmeesd’exploitation
Duplication d’un processus. Seulefa¸condecre´erunprocessusa`basniveau. Appelsyste`me fork() Cr´eeunecopiecompleˆteduprocessus,filsdeceprocessus. Le fils change de programme en appelant exec() . La fonction exec() remplacelecodeetsesdonne´esparcelui d’une nouvelle commande.
dnpeorecsssuCr´eatio
Eutiox´ecnecond’uednamm
Exe´cutiond’unecommande: tar -zcvf file * Le shell se duplique avec fork() . On a alors deux processus shell identiques. Leshellpe`reattendlafinduprocessusfilsavec wait() . Leshellfilsremplacesonex´ecutableparceluidelacommande tar avec exec() La commande tar s’exe´cute.Lorsqu’ellesetermine,le processus fils disparait. Leshellp`ereestr´eactive´etattendlacommandesuivante.
nSyst`emtienCoroioatitnose’dxelpsabe´S-naeJ
tion
L’appel a fork() duplique le processus. L’ex´ecutioncontinuedanslesdeuxprocessus. Valeurretourne´epar fork() : Dansleprocessusp`ere,retournelePIDdufils. Dans le processus fils, retourne 0. Silefork´echoue,renvoie-1. getpid() et getppid() getpid() retourne le PID du processus. getppid() retournelePIDdupe`reduprocessus.
La primitive wait permeta`unprocessusd’attendrelafin 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 permetd’indiquerauprocessusp`erequ’uneerreur s’est produite. status=0 si pas d’erreur.
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. ´ S’utiliseeng´ene´ralapre`sun fork . Leprogrammeetlesdonne´esduprocessuschangent. Maisgardemeˆmepidetmˆemep`ere. M´ecanismelorsdel’appeld’unprogramme(ex, ls ) Terminal de commande fait un fork() . Processuscr´e´erecouvertparleprogramme ls . Leterminal(pe`re)attendlafindesonfils(appelsyst`eme wait() )